如何在使用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器的更多信息