Json.NET技巧兩則: 忽略屬性及列舉轉字串

開發主戰場漸漸移到前端,應用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才對!!

歡迎推文分享:
Published 03 September 2013 11:01 PM 由 Jeffrey
Filed under: ,
Views: 10,763



意見

# 森哥 said on 03 September, 2013 10:55 PM

請問黑大,

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

# Jeffrey said on 04 September, 2013 08:29 AM

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

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<September 2013>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication