[英]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.