簡體   English   中英

序列化json時如何忽略JsonProperty(PropertyName = "someName")?

[英]How to ignore JsonProperty(PropertyName = "someName") when serializing json?

我有一些使用 ASP.Net MVC 的 C# 代碼,它利用 Json.Net 來序列化一些 DTO。 為了減少有效負載,我利用 [JsonProperty(PropertyName = "shortName")] 屬性在序列化期間使用較短的屬性名稱。

當客戶端是另一個 .Net 應用程序或服務時,這非常有效,因為反序列化將對象層次結構重新組合在一起,使用更長更友好的名稱,同時保持實際傳輸負載較低。

當客戶端通過瀏覽器使用 javascript/ajax 時,問題就出現了。 它發出請求,並獲取 json ...但該 json 使用的是縮短的不太友好的名稱。

如何讓 json.net 序列化引擎以編程方式忽略 [JsonProperty(PropertyName = "shortName")] 屬性? 理想情況下,我的 MVC 服務將坐在那里運行並通常使用縮短的屬性名稱進行序列化。 當我的代碼檢測到特定參數時,我想使用較長的名稱序列化數據並忽略 [JsonProperty()] 屬性。

有什么建議?

謝謝,

凱文

這可以使用自定義合同解析器輕松完成。 這是您需要的所有代碼:

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"
}

只想用 Deserializer 類“擴展”Brian 的答案,

static T Deserialize<T>(string json)
{
    return JsonConvert.DeserializeObject<T>(json, new JsonSerializerSettings()
    {
        ContractResolver = new LongNameContractResolver()
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM