[C#] JSON.net 的一些小技巧,捨去null、自訂日期格式、decimal 轉字串

2017-08-01

JSON.net 非常好用,最近因為要開API給人家,所以對JSON必須要有一些較細微的控制,所以遇到問題我就筆記一下,其實網路文件很多應該找也是一堆方法也不只一種,所以有需要就參考一下囉..

image

我的C# 物件模型是 :

    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


當麻許的超技八 2014 | Donma Hsu Design.