如何在使用Json.net序列化时更改属性名称?
我有一些C#数据集对象中的数据。 我可以使用像这样的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]
属性来修饰你想要控制其名字的属性,这个属性允许你指定一个不同的名称:
[JsonProperty(PropertyName = "FooBar")] public string Foo { get; set; }
文档: 序列化属性
如果您没有访问类来更改属性,或者不想总是使用相同的重命名属性,则重命名也可以通过创build自定义parsing器来完成。
例如,如果您有一个名为MyCustomObject
的类,它具有一个名为LongPropertyName
的属性,则可以使用像这样的自定义parsing器…
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; } }
然后调用序列化并提供parsing器
var result = JsonConvert.SerializeObject(myCustomObjectInstance, new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });
结果将被缩短为{“Short”:“prop value”}而不是{“LongPropertyName”:“prop value”}
有关自定义parsing器的更多信息