JavaScriptSerializer - 列挙型のJSONシリアル化を文字列として行う 質問する

JavaScriptSerializer - 列挙型のJSONシリアル化を文字列として行う 質問する

プロパティを含むクラスがありenum、 を使用してオブジェクトをシリアル化するとJavaScriptSerializer、JSON の結果には列挙の「名前」ではなく、列挙の整数値が含まれます。カスタム を作成せずに、JSON でstring列挙を として取得する方法はありますか?定義またはオブジェクト プロパティを装飾できる属性があるでしょうか?stringJavaScriptConverterenum

例:

enum Gender { Male, Female }

class Person
{
    int Age { get; set; }
    Gender Gender { get; set; }
}

望ましい JSON 結果:

{ "Age": 35, "Gender": "Male" }

理想的には、組み込みの .NET フレームワーク クラスを使用した回答を探していますが、それが不可能な場合は代替手段 (Json.net など) を歓迎します。

ベストアンサー1

私は発見したJson.NETJsonConverter組み込み型を渡す属性を使用して、まさに私が求めている機能を提供しますStringEnumConverter

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

[JsonConverter(typeof(StringEnumConverter))]
public Gender Gender { get; set; }

詳細は以下をご覧ください。StringEnumConverterドキュメンテーション

このコンバーターをよりグローバルに構成する場所は他にもあります。

  • enum を常に文字列としてシリアル化/逆シリアル化したい場合は、enum 自体を次のようにします。

      [JsonConverter(typeof(StringEnumConverter))]  
      enum Gender { Male, Female }
    
  • 属性の装飾を避けたい場合は、JsonSerializerにコンバータを追加することができます(ビョルン・エギル):

      serializer.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); 
    

そして、そのシリアル化中に見られるすべての列挙型に対して機能します(トラヴィス)。

  • またはJsonConverter(提案者バナナ):

      JsonConvert.SerializeObject(MyObject, 
          new Newtonsoft.Json.Converters.StringEnumConverter());
    

さらに、大文字と小文字の区別や数字を受け付けるかどうかを制御できます。StringEnumConverter(ネーミング戦略、ブール値)コンストラクタ。

おすすめ記事