web-dev-qa-db-ja.com

StringEnumConverterをすべての列挙に適用するようにJson.Netをグローバルに指示する方法

Json.netを使用して、列挙を文字列表現にデシリアライズしたり、その逆を行いたいです。フレームワークにStringEnumConverterを適用するように伝えるために私が理解できる唯一の方法は、次のように問題のプロパティに注釈を付けることです:

[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }

ただし、私のユースケースでは、追加の注釈を必要とせずに、すべての列挙がStringEnumConverterを使用して(デ)シリアル化されるようにjson.netをグローバルに構成する方がはるかに便利です。

そうする方法はありますか、例えばカスタムJsonSerializerSettingsの助けを借りて?

80
Leo

StringEnumConverterJsonSerializerSettings Convertersコレクションに追加します。

ドキュメント:JsonConvertersでシリアル化


シリアライザーでcamelCasingを使用する場合、これも設定できます。

SerializerSettings.Converters.Add(
    new StringEnumConverter { CamelCaseText = true });

これにより、SomeValuesomeValueにシリアル化されます。

109

他の回答はASP.NETでも機能しますが、これらの設定を一般的にJsonConvertを任意のコンテキストで呼び出すために設定したい場合は、次のことができます。

JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
    return settings;
});

http://james.newtonking.com/archive/2013/05/08/json-net-5-0-release-5-defaultsettings-and-extension-data を参照)

37
Gaz

Global.asax.csに追加します

HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());
18
Iggy

ASP.NET Core 2の場合、以下を実行します。

_    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc()
                .AddJsonOptions(options =>
                {
                    options.SerializerSettings.Converters.Add(new StringEnumConverter());
                });

        ...
_

これはservices.AddJsonOptions(...)ではなく、MVCの設定を作成しているため、MVCにタグ付けする必要があります。

3
Simon_Weaver

以前の回答は、バージョン12.0.1の時点で古くなっています。新しい方法は、NamingStrategyを使用することです。 https://www.newtonsoft.com/json/help/html/NamingStrategyCamelCase.htm

serializerSettings.Converters.Add(
    new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() }
);
0
Stephen