首页 文章

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

提问于
浏览
321

我在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,在'Serializing and Deserializing JSON'→'Serialization Attributes'下,它说"JsonPropertyAttribute... allows the name to be customized" . 但没有例子 . Does anyone know how to use a JsonPropertyAttribute to change the property name to something else?

Direct link to documentation

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

3 回答

  • 2

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

    using Newtonsoft.Json;
    // ...
    
    [JsonProperty(PropertyName = "FooBar")]
    public string Foo { get; set; }
    

    文件: Serialization Attributes

  • 54

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

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

  • 615

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

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

相关问题