web-dev-qa-db-ja.com

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のドキュメントはまばらです。あなたが素晴らしい例を持っているならば、私はそれを公式文書に追加しようとします。ありがとうございます。

366
culix

[JsonProperty]属性を使って名前を制御したいプロパティを修飾すると、別の名前を指定できます。

using Newtonsoft.Json;
// ...

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

ドキュメント:直列化属性

681
Darin Dimitrov

プロパティを変更するためにクラスにアクセスできない場合、または常に同じ名前変更プロパティを使用したくない場合は、カスタムリゾルバを作成して名前の変更を行うこともできます。

たとえば、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 });

そして結果は {"LongPropertyName": "prop value"} ではなく {"Short": "prop value"} に短縮されます。

カスタムリゾルバについてのさらなる情報 ここ

63
StingyJack

それを行うにはさらに別の方法があります。これは特定の NamingStrategy を使用することです。これはクラスまたはプロパティを[JSonObject]または[JsonProperty]で修飾することによって適用できます。

CamelCaseNamingStrategyのような事前定義された命名戦略がありますが、あなたはあなた自身のものを実装することができます。

さまざまな命名方法の実装はここにあります。 https://github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization

3
JotaBe