关于c#:如何在使用Json.net进行序列化时更改属性名称?

How can I change property names when serializing with Json.net?

我在C数据集对象中有一些数据。我现在可以使用这样的json.net转换器序列化它。

1
2
3
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]属性来修饰希望控制其名称的属性,该属性允许您指定不同的名称:

1
2
3
4
5
using Newtonsoft.Json;
// ...

[JsonProperty(PropertyName ="FooBar")]
public string Foo { get; set; }

文档:序列化属性


如果您无权访问类来更改属性,或者不希望总是使用相同的重命名属性,也可以通过创建自定义冲突解决程序来进行重命名。

例如,如果您有一个名为MyCustomObject的类,它有一个名为LongPropertyName的属性,那么您可以使用这样的自定义冲突解决程序…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
  }
}

然后调用序列化并提供冲突解决程序:

1
2
 var result = JsonConvert.SerializeObject(myCustomObjectInstance,
                new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });

结果将缩短为"short":"prop value"而不是"longpropertyname":"prop value"

此处提供有关自定义冲突解决程序的详细信息


还有另一种方法可以做到这一点,即使用特定的纳米策略,通过用[JSonObject][JsonProperty]对类或属性进行装饰,该策略可以应用于类或属性。

有一些预定义的命名策略,如CamelCaseNamingStrategy,但您可以实现自己的命名策略。

不同命名策略的实现可以在这里找到:https://github.com/jamesnk/newtonsoft.json/tree/master/src/newtonsoft.json/serialization