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


84

json.netを使用して、列挙型を文字列表現に逆シリアル化し、その逆も行いたいです。フレームワークに適用するように指示する唯一の方法StringEnumConverterは、問題のプロパティに次のように注釈を付けることです。

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

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

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

回答:


113

ConvertersコレクションにStringEnumConverterを追加しJsonSerializerSettingsます。

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


シリアライザーでキャメルケースを使用する場合は、次のように設定することもできます。

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

これはにシリアル化さSomeValuesomeValueます。


これをglobal.asax.csの下に設定しようとしましたが、機能GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettingsしませんでした。なぜそうなるのか、何か考えはありますか?
2013

フィールド名を小文字にする方法はありますか?CamelCaseTextフラグはクラスにハードコードされており、別のケーシング戦略を使用する方法がわかりません。
mikebridge 2013年

@mikebridgeこれに対する解決策を見つけましたか?また、各列挙型オプションの名前を自分で設定する(または小文字を使用する)方法を探しています。
ティム2014年

1
@Timmはい、私はこのポストを使用: stackoverflow.com/questions/6288660/...
mikebridge

@mikebridgeありがとう。列挙型エントリごとの[EnumMember(Value = "undefined")]はJSON.Netでも正常に機能することがわかりました(ただし、MicrosoftのJSONデシリアライザーではサポートされていません)
Timm

40

他の回答は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を参照してください)


2
私が探していたもの!でも、短い:JsonConvert.DefaultSettings = () => new JsonSerializerSettings { Converters = { new StringEnumConverter { CamelCaseText = true } } };
Kapé

あなたは私を救いました!ありがとう兄貴!gist.github.com/regisdiogo/27f62ef83a804668eb0d9d0f63989e3e
paqogomez

18

Global.asax.csに追加します

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

このソリューションは、WebAPIのシリアル化に完全に機能するようです。ありがとう!
チャーリー2014

5

ASP.NET Core 2の場合、次の手順を実行します。

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

        ...

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.