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

时间:2012-01-09 23:24:07

标签: c# serialization json.net

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

DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);

但是,在打印到.json文件时,它使用data中的属性名称。我想将属性名称更改为不同的名称(例如,将'foo'更改为'bar')。

Json.net documentation中,在“序列化和反序列化JSON”→“序列化属性”下,它表示“JsonPropertyAttribute ...允许自定义名称”。但没有例子。 有谁知道如何使用JsonPropertyAttribute将属性名称更改为其他名称?

Direct link to documentation

Json.net的文档似乎很少。如果你有一个很好的例子,我会尝试将它添加到官方文档中。 谢谢!

3 个答案:

答案 0 :(得分:690)

您可以使用[JsonProperty]属性修饰您希望控制其名称的属性,该属性允许您指定其他名称:

using Newtonsoft.Json;
// ...

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

文档: Serialization Attributes

答案 1 :(得分:64)

如果您无权访问类以更改属性,或者不希望始终使用相同的重命名属性,则还可以通过创建自定义解析程序来重命名。

例如,如果您有一个名为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”}

有关自定义解析器的更多信息here

答案 2 :(得分:3)

还有另一种方法,即使用特定的NamingStrategy,可以通过使用[JSonObject][JsonProperty]进行装饰来应用于类或属性。< / p>

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

可以在此处找到不同命名策略的实现:https://github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization