Json.netを使用して、列挙を文字列表現にデシリアライズしたり、その逆を行いたいです。フレームワークにStringEnumConverter
を適用するように伝えるために私が理解できる唯一の方法は、次のように問題のプロパティに注釈を付けることです:
[JsonConverter(typeof(StringEnumConverter))]
public virtual MyEnums MyEnum { get; set; }
ただし、私のユースケースでは、追加の注釈を必要とせずに、すべての列挙がStringEnumConverter
を使用して(デ)シリアル化されるようにjson.netをグローバルに構成する方がはるかに便利です。
そうする方法はありますか、例えばカスタムJsonSerializerSettings
の助けを借りて?
StringEnumConverter
をJsonSerializerSettings
Convertersコレクションに追加します。
ドキュメント:JsonConvertersでシリアル化
シリアライザーでcamelCasingを使用する場合、これも設定できます。
SerializerSettings.Converters.Add(
new StringEnumConverter { CamelCaseText = true });
これにより、SomeValue
がsomeValue
にシリアル化されます。
他の回答はASP.NETでも機能しますが、これらの設定を一般的にJsonConvertを任意のコンテキストで呼び出すために設定したい場合は、次のことができます。
JsonConvert.DefaultSettings = (() =>
{
var settings = new JsonSerializerSettings();
settings.Converters.Add(new StringEnumConverter {CamelCaseText = true});
return settings;
});
Global.asax.csに追加します
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
(new Newtonsoft.Json.Converters.StringEnumConverter());
ASP.NET Core 2の場合、以下を実行します。
_ public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(options =>
{
options.SerializerSettings.Converters.Add(new StringEnumConverter());
});
...
_
これはservices.AddJsonOptions(...)
ではなく、MVCの設定を作成しているため、MVCにタグ付けする必要があります。
以前の回答は、バージョン12.0.1の時点で古くなっています。新しい方法は、NamingStrategyを使用することです。 https://www.newtonsoft.com/json/help/html/NamingStrategyCamelCase.htm
serializerSettings.Converters.Add(
new StringEnumConverter { NamingStrategy = new CamelCaseNamingStrategy() }
);