簡體   English   中英

如何動態地將 [JsonProperty("")] 注釋添加到屬性以序列化 JSON?

[英]How add dynamically [JsonProperty("")] annotarion to properties for purporse of serializing JSON?

我想動態添加 [JsonProperty("")],我該如何實現呢?

class Address
{
     public string Number { get; set; }
     public string Street { get; set; }
     public string City { get; set; }
     public string Country { get; set; }
}

class Person
{
     public string Name { get; set; }
     public int Age { get; set; }
     public Address PostalAddress { get; set; }
}

我想在運行時將 [JsonProperty("")] 注釋添加到嵌套的class 。

 class Address
    {    [JsonProperty("Nmb")]
         public string Number { get; set; }
          [JsonProperty("Str")]
         public string Street { get; set; }
         public string City { get; set; }
         public string Country { get; set; }
    }

我需要動態添加,因為我使用的 class 來自其他庫。 我的目標是使用縮短的屬性名稱序列化 json。 我怎樣才能做到這一點?

為此,您可以使用Newtonsoft.Json.SerializationContractResolver ,定義需要序列化或反序列化的 json 的所有屬性到屬性映射。 樣本:

public class CustomContractResolver : DefaultContractResolver
{
    private Dictionary<string, string> PropertyMappings { get; set; }

    public CustomContractResolver()
    {
        this.PropertyMappings = new Dictionary<string, string>
        {
            {"Number", "Nmb"},
            {"Street", "Str"},
            //all properties,
        };
    }

    protected override string ResolvePropertyName(string propertyName)
    {
        string resolvedName = null;
        var resolved = this.PropertyMappings.TryGetValue(propertyName, out resolvedName);
        return (resolved) ? resolvedName : base.ResolvePropertyName(propertyName);
    }
}

以下是如何使用它:

var jsonObject = JsonConvert.DeserializeObject(jsonString, new JsonSerializerSettings{ ContractResolver = new CustomContractResolver() });

對於我的問題,沒有合適的方法在運行時添加注釋。 但是要序列化 json,如果我們需要自定義序列化,就像上面發布的答案一樣,我們可以這樣做:(上面的答案對我來說不適用於嵌套的 class,如果我們識別 ZA2F2ED4F8EBC2CBB4C21A29DC 名稱,我們需要使用這種方式)

https://stackoverflow.com/a/33290710/1133217

這種方式也可以防止通過使用創建不必要的對象進行序列化

 public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();

當用戶第一次點擊時,它會被創建,當瀏覽器打開時,即使有其他請求,它也不會被創建兩次。 另外,通過這種方式,我們可以識別 class 名稱,並保證哪個屬性將在哪個 class 中更改。

暫無
暫無

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

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