[英]How to change property names depending on the type when serializing with Json.net?
[英]How can I change property names when serializing with Json.net?
我在 C# DataSet object 中有一些數據。我現在可以使用這樣的 Json.net 轉換器對其進行序列化
DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);
但是,這在打印到 .json 文件時使用data
中的屬性名稱。 我想將屬性名稱更改為不同的名稱(例如,將“foo”更改為“bar”)。
在Json.net 文檔中,在“序列化和反序列化 JSON”→“序列化屬性”下,它說“JsonPropertyAttribute ... 允許自定義名稱”。 但是沒有例子。 有誰知道如何使用 JsonPropertyAttribute 將屬性名稱更改為其他名稱?
( 直接鏈接到文檔)
Json.net 的文檔似乎很少。 如果您有一個很好的示例,我會嘗試將其添加到官方文檔中。 謝謝!
您可以使用[JsonProperty]
屬性裝飾您希望控制其名稱的屬性,該屬性允許您指定不同的名稱:
using Newtonsoft.Json;
// ...
[JsonProperty(PropertyName = "FooBar")]
public string Foo { get; set; }
文檔: 序列化屬性
如果您無權訪問類來更改屬性,或者不想始終使用相同的重命名屬性,也可以通過創建自定義解析器來完成重命名。
例如,如果您有一個名為MyCustomObject
的類,它有一個名為LongPropertyName
的屬性,您可以使用這樣的自定義解析器……
public class CustomDataContractResolver : DefaultContractResolver
{
public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
if (property.DeclaringType == typeof(MyCustomObject))
{
if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
{
property.PropertyName = "Short";
}
}
return property;
}
}
然后調用序列化並提供解析器:
var result = JsonConvert.SerializeObject(myCustomObjectInstance,
new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });
結果將縮短為{"Short":"prop value"}而不是{"LongPropertyName":"prop value"}
更多關於自定義解析器的信息在 這里
還有另一種方法可以做到這一點,即使用特定的NamingStrategy ,它可以通過用[JSonObject]
或[JsonProperty]
裝飾來應用於類或屬性。
有預定義的命名策略,如CamelCaseNamingStrategy
,但您可以實現自己的命名策略。
不同命名策略的實現可以在這里找到: https : //github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization
你可以直接使用
[JsonPropertyName("access_token")]
public string AccessToken { get; set; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.