2013-12-16 48 views
9

我使用ASP.Net MVC,這是利用Json.Net的序列化一些DTO的一些C#代碼。爲了減少負載,我已經使用[JsonProperty(PropertyName =「shortName」)]屬性在序列化過程中使用更短的屬性名稱。如何在序列化json時忽略JsonProperty(PropertyName =「someName」)?

這個偉大的工程,當客戶端是其他.NET應用程序或服務,作爲反序列化把對象層次重新走到一起,用的時間越長更友好的名稱,同時保持實際傳輸的有效載荷低。

問題進場時,客戶端的JavaScript是/ AJAX通過瀏覽器。它提出請求並獲取json ...但是json使用縮短的不友好名稱。

我怎樣才能讓json.net序列化引擎忽略[JsonProperty(屬性名=「SHORTNAME」)編程的屬性?理想情況下,我的MVC服務將在那裏運行,並通常使用縮短的屬性名稱進行序列化。當我的代碼檢測到一個特定的參數時,我想使用更長的名稱序列化數據,並忽略[JsonProperty()]屬性。

有什麼建議嗎?

感謝,

凱文

+0

只是刪除了'JsonProperty'並返回根據一個匿名對象到你傳遞的參數。像'新{用戶名= UNAME}' –

+0

我認爲最好的辦法是做一個自定義的串行器(與json.NET,而不是從頭開始),並刪除註釋。使用短名稱和長名稱作爲序列化程序的設置,並在序列化時告訴它你想要什麼。 json.NET不支持在運行時使用/忽略註釋。如果他們在編譯時在那裏,他們將被使用(禁止一些主要的黑客攻擊)。 – evanmcdonnal

+0

我欣賞那裏的評論。 @evanmcdonnal:如果我們有一個自定義序列化去,就需要我們做這個特定的DTO級我們有很多的DTO通過我們的許多開發團隊分散翻過許多解決方案(連接到每一個DTO?)。理想情況下,我們可以找到一種相對優雅的方式來加入到序列化過程中,而無需通過所有DTO進行觸摸並保持這種方式。 – Kevin

回答

23

這可以很容易地使用自定義的合同解析器來完成。這裏是所有的代碼,你將需要:

class LongNameContractResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     // Let the base class create all the JsonProperties 
     // using the short names 
     IList<JsonProperty> list = base.CreateProperties(type, memberSerialization); 

     // Now inspect each property and replace the 
     // short name with the real property name 
     foreach (JsonProperty prop in list) 
     { 
      prop.PropertyName = prop.UnderlyingName; 
     } 

     return list; 
    } 
} 

下面是一個使用解析器快速演示:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Foo foo = new Foo 
     { 
      CustomerName = "Bubba Gump Shrimp Company", 
      CustomerNumber = "BG60938" 
     }; 

     Console.WriteLine("--- Using JsonProperty names ---"); 
     Console.WriteLine(Serialize(foo, false)); 
     Console.WriteLine(); 
     Console.WriteLine("--- Ignoring JsonProperty names ---"); 
     Console.WriteLine(Serialize(foo, true)); 
    } 

    static string Serialize(object obj, bool useLongNames) 
    { 
     JsonSerializerSettings settings = new JsonSerializerSettings(); 
     settings.Formatting = Formatting.Indented; 
     if (useLongNames) 
     { 
      settings.ContractResolver = new LongNameContractResolver(); 
     } 

     return JsonConvert.SerializeObject(obj, settings); 
    } 
} 

class Foo 
{ 
    [JsonProperty("cust-num")] 
    public string CustomerNumber { get; set; } 
    [JsonProperty("cust-name")] 
    public string CustomerName { get; set; } 
} 

輸出:

--- Using JsonProperty names --- 
{ 
    "cust-num": "BG60938", 
    "cust-name": "Bubba Gump Shrimp Company" 
} 

--- Ignoring JsonProperty names --- 
{ 
    "CustomerNumber": "BG60938", 
    "CustomerName": "Bubba Gump Shrimp Company" 
} 
相關問題