[C#] JSON.net 的一些小技巧,捨去null、自訂日期格式、decimal 轉字串
2017-08-01
JSON.net 非常好用,最近因為要開API給人家,所以對JSON必須要有一些較細微的控制,所以遇到問題我就筆記一下,其實網路文件很多應該找也是一堆方法也不只一種,所以有需要就參考一下囉..
public class User { public string Name { get; set; } public DateTime Birthday { get; set; } public decimal Price { get; set; } public string Memo { get; set; } }
如果直接使用 JsonConvert.SerializeObject你會拿到
var user1 = new User { Name = "使用者1", Birthday = DateTime.Now, Price = 200 }; Response.Write(JsonConvert.SerializeObject(user1));
結果:
{"Name":"使用者1","Birthday":"2017-08-01T16:40:12.2026042+08:00","Price":200.0,"Memo":null}
1.去除null 的Property上述例子中Memo 如何將 是null 的Property 去除呢?
Response.Write(JsonConvert.SerializeObject(user1, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));
將NullValueHandling 設為 Ignore 即可
2. 將日期專換成固定格式 ,我想要將日期轉換成 yyyy/MM/dd HH:mm:ss
Response.Write(JsonConvert.SerializeObject(user1, new JsonSerializerSettings { DateFormatString="yyyy/MM/dd HH:mm:ss" }));
結果:
{"Name":"使用者1","Birthday":"2017/08/01 16:40:12","Price":200.0,"Memo":null}
3.將decimal 屬性的 Property 轉成固定格式的string Property 上述的例子中Price 是 decimal 的類型,我想要讓它輸出時變成字串,但是後面的小數點如果是.0 就不要顯示小數點,如果有小數點就要正常顯示,首先科普一下,一般的decimal 可以透過 .ToString(“G29”) 來做到這件事情,但是我們現在要讓它輸出,首先我們得先建立一個物件並且繼承JsonConverter 做到處理decimal 這型態的屬性。
public class DecimalToStringConverter : JsonConverter { public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JToken jt = JValue.ReadFrom(reader); return jt.Value<decimal>(); } public override bool CanConvert(Type objectType) { return typeof(decimal).Equals(objectType); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { serializer.Serialize(writer, ((decimal)value).ToString("G29")); } }
這時候我們轉換的時候將此 converter 放入 :
var listJsonConvert = new List<JsonConverter>(); var decimal2StringConverter = new DecimalToStringConverter(); listJsonConvert.Add(decimal2StringConverter); Response.Write(JsonConvert.SerializeObject(user1, new JsonSerializerSettings { Converters= listJsonConvert }));
結果:
{"Name":"使用者1","Birthday":"2017-08-01T16:40:12.2026042+08:00","Price":"200","Memo":null}
遇到問題處理了一下 ,給碰到需要的人..
reference:
https://stackoverflow.com/questions/17369278/convert-long-number-as-string-in-the-serialization