簡體   English   中英

使用 Json.net 序列化時如何更改屬性名稱?

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

我在 C# DataSet object 中有一些數據。我現在可以使用這樣的 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]屬性裝飾您希望控制其名稱的屬性,該屬性允許您指定不同的名稱:

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"}

更多關於自定義解析器的信息在 這里

還有另一種方法可以做到這一點,即使用特定的NamingStrategy ,它可以通過用[JSonObject][JsonProperty]裝飾來應用於類或屬性。

有預定義的命名策略,如CamelCaseNamingStrategy ,但您可以實現自己的命名策略。

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

你可以直接使用

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM