Json.netでシリアル化するときにプロパティ名を変更するにはどうすればよいですか?


434

C#DataSetオブジェクトにいくつかのデータがあります。このようなJson.netコンバーターを使用して、今すぐシリアル化できます

DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);

ただし、これはdata.jsonファイルに出力するときのプロパティ名を使用します。プロパティ名を別の名前に変更したいと思います(たとえば、「foo」を「bar」に変更します)。

Json.netドキュメント、下の「シリアル化と逆シリアル化JSON」→それは「JsonPropertyAttributeは...名前をカスタマイズすることを可能にする」と言う「シリアル化属性」。しかし、例はありません。JsonPropertyAttributeを使用してプロパティ名を別の名前に変更する方法を知っている人はいますか?

ドキュメントへの直接リンク

Json.netのドキュメントはまばらです。良い例があれば、公式ドキュメントに追加してみます。よろしくお願いします!


3
参考までにサンプル-> JSONのシリアライズ-> JsonPropertyAttribute名のドキュメントにこの例があります。どの時点で追加されたのかわかりません。
ブライアンロジャース

回答:


791

[JsonProperty]別の名前を指定できる属性を使用して、その名前を制御するプロパティを装飾できます。

using Newtonsoft.Json;
// ...

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

ドキュメント:シリアル化属性


1
データセットではなく、作成したカスタムオブジェクトにデータを読み込む必要がありますか?
culix

3
@culix、はい、モデルを使用する必要があります。DataSetは弱く型付けされた構造であるため、そのプロパティ名について話すことはあまり論理的ではありません。
Darin Dimitrov、2012年

76
省略形として、次のこともできます[JsonProperty("FooBar")]
Bart Verkoeijen

2
@DarinDimitrovはJson .NETなしでこれを行う方法はありますか?
CH81

12
ただし、モデルの使用は簡単です。JSONのサンプルを取り、「形式を選択して貼り付け」->「JSONをクラスとして貼り付け」を使用して空の.csファイルに貼り付けます。-Visual Studioに組み込まれています。-そこから、基本的には、.NETの命名規則などを使用するように、タイトルケースとして設定するか、名前を変更する必要があります(前者にはタイトルケースコンバーターを使用し、後者にはJsonProperty属性を使用します)。
BrainSlugs83 2016年

71

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

たとえば、と呼ばれる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"}に短縮されます。

カスタムリゾルバーの詳細はこちら


1
シリアル化するクラスが、Newtonsoft.Jsonパッケージの異なるバージョンを含む別のアセンブリで宣言されている場合、これはより良いソリューションです。(それはどんなエラーも投げないかもしれません)。DefaultContractResolverJsonConvert.Serialize()メソッドが使用されているのと同じアセンブリ内に置かれなければなりません。
Artemious

6

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

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

さまざまな命名戦略の実装は、https//github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serializationにあります。


3
可能であれば、カスタムのNamingStrategy実装の例を共有してください
user1007074

もちろん違います。あなたは自分でそれを行うべきでしたが、newtonsoft.com / json / help / html /を継承するだけでよいことをお伝えします。既存のクラスの実装を確認して、独自のクラスを作成できます。
JotaBe

おかげで-私は私のコメントを更新している必要があります:実際には、GitHubのある栄光のおかげで、1は、例としてNewtonsoft独自の実装の1つを使用することができ、たとえば、この1
user1007074

8
@JotaBe、それはスタックオーバーフローの精神ではありません。そして、率直に言って、私の仕事を成し遂げることを望むプログラマーとして、私が提供したかもしれないコードを持ち上げた方が1000倍良かったでしょう。そして、あなたも私の投票を得たでしょう。私は18年のコーディング経験があり、TripleByteによってc#の「エキスパート」としてランク付けされています。すべての問題が「読者のための演習」として残される必要はありません。時々、私たちは自分の仕事をして進みたいだけです。
bboyle1234

2
私はあなたに同意します、そして私は通常この種のコメントを書きません。ただし、この場合、リンクされたコードを確認することは、説明するよりもはるかに優れています。そして、json.netは非常によく文書化されたオープンソースライブラリです。実装へのリンクが含まれています(完璧な例)
JotaBe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.