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

本文关键字:何更改 属性 net Json 序列化 使用 | 更新日期: 2023-09-27 18:20:01

我在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"下→ 'SerializationAttributes中说"JsonPropertyAttribute…允许自定义名称"。但没有任何例子有人知道如何使用JsonPropertyAttribute将属性名称更改为其他名称吗

(文件的直接链接)

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

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

您可以用[JsonProperty]属性装饰您想要控制其名称的属性,该属性允许您指定不同的名称:

using Newtonsoft.Json;
// ...
[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

有关自定义解析器的更多信息,请点击此处

还有另一种方法可以做到这一点,那就是使用特定的命名策略,可以通过用[JSonObject][JsonProperty]装饰来应用于类或属性。

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

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

您可以直接使用

[JsonProperty(Name = "access_token")]
public string AccessToken { get; set; }

[JsonProperty("access_token")]
public string AccessToken { get; set; }

Json库将检测如何更改它