如何在使用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文档中,在“序列化和反序列化JSON”→“序列化属性”下,它表示“JsonPropertyAttribute ...允许名称自定义”。 但没有例子。 有谁知道如何使用JsonPropertyAttribute将属性名称更改为其他内容?

(直接链接到文档)

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


你可以使用[JsonProperty]属性来修饰你希望控制其名称的属性,该属性允许你指定一个不同的名称:

[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这样的预定义命名策略,但是你可以实现你自己的命名策略。

链接地址: http://www.djcxy.com/p/20075.html

上一篇: How can I change property names when serializing with Json.net?

下一篇: JSON.NET Error Self referencing loop detected for type