開發主戰場漸漸移到前端,應用Json.NET的深度也逐步增加。今天學會Json.NET技巧兩則,筆記如下:

情境1:

待序列化物件的部分屬性純粹供.NET端應用,不需傳到前端,希望能予以排除以縮短JSON字串,減少頻寬浪費。

解決方案

方法1 - 在屬性加上[JsonIgnore],負向表列哪些屬性不要序列化。
方法2 - 在類別加上[DataContract],為需序列化屬性加上[DataMember],正向表列哪些屬性需要序列化。
參考: Efficient JSON with Json.NET – Reducing Serialized JSON Size

情境2

預設列舉(Enum)屬性會被序列化為對應數值(int),但在許多應用場合,轉為列舉項目文字更有可讀性。

解決方案

為列舉屬性加上[JsonConverter(typeof(StringEnumConverter))]就搞定囉!

來個範例程式展示效果:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        public enum Options
        {
            Option1, Option2
        }
 
        public class Entity
        {
            public Options A1 { get; set; }
            public Options A2 { get; set; }
            [JsonConverter(typeof(StringEnumConverter))]
            public Options B1 { get; set; }
            [JsonConverter(typeof(StringEnumConverter))]
            public Options B2 { get; set; }
            public string P1 { get; set; }
            [JsonIgnore]
            public string P2 { get; set; }
        }
 
 
        static void Main(string[] args)
        {
            Entity ent = new Entity()
            {
                A1 = Options.Option1,
                A2 = Options.Option2,
                B1 = Options.Option1,
                B2 = Options.Option2,
                P1 = "P1",
                P2 = "P2"
            };
            Console.WriteLine(
                JsonConvert.SerializeObject(ent, Formatting.Indented));
            Console.Read();
        }
    }
}

執行結果如下,其中A1, A2兩個列舉屬性被轉成0與1(Json.NET的預設行為),B1, B2列舉屬性因加上[JsonConverter(typeof(StringEnumConverter))]宣告,被轉為"Option1"及"Options2";加上[JsonIgnore]的P2屬性,則被排除在JSON字串之外:

{
  "A1": 0,
  "A2": 1,
  "B1": "Option1",
  "B2": "Option2",
  "P1": "P1"
}

原本擔心要費點手腳的兩個需求,透過Attribute宣告就輕易搞定,不禁讚嘆Json.NET考慮周詳,很好很強大,實在該直接收入.NET Framework才對!!


Comments

# by 森哥

請問黑大, 針對不需要序列化的「屬性」是否可以透過程式「動態」設定或是過濾?

# by Jeffrey

to 森哥,好問題! 解答在此: http://blog.darkthread.net/post-2013-09-04-jsonnet-dyna-prop-serialization.aspx

Post a comment