[英]How to ignore JsonProperty(PropertyName = "someName") when serializing 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.Serialization
的ContractResolver
,定義需要序列化或反序列化的 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.