開發主戰場漸漸移到前端,應用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
{
publicenum Options
{
Option1, Option2
}
publicclass 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; }
publicstring P1 { get; set; }
[JsonIgnore]
publicstring P2 { get; set; }
}
staticvoid 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才對!!