모든 열거 형에 StringEnumConverter를 적용하도록 Json.Net에 전역 적으로 알리는 방법


84

열거 형을 문자열 표현으로 deserialize하고 json.net을 사용하여 그 반대도 마찬가지입니다. 프레임 워크에 적용하도록 지시 할 수있는 유일한 방법 StringEnumConverter은 다음과 같이 해당 속성에 주석을 추가하는 것입니다.

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

그러나 내 사용 사례에서는 StringEnumConverter추가 주석없이 모든 열거 형이를 사용하여 (역) 직렬화되도록 json.net을 전역 적으로 구성하는 것이 훨씬 더 편리 할 것 입니다.

예를 들어 사용자 정의의 도움으로 그렇게 할 수있는 방법이 JsonSerializerSettings있습니까?

답변:


113

Converters 컬렉션에 StringEnumConverter를 추가합니다 JsonSerializerSettings.

문서 : JsonConverters로 직렬화


serializer가 camelCasing을 사용하도록하려면 다음과 같이 설정할 수도 있습니다.

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

이것은로 직렬화 SomeValue됩니다 someValue.


내 global.asax.cs에서 이것을 설정하려고 시도했지만 GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings작동하지 않았습니다. 왜 그럴 수 있는지 아십니까?
amhed

필드 이름을 소문자로 바꾸는 방법이 있습니까? CamelCaseText 플래그는 클래스에 하드 코딩되어 있으며 다른 대 / 소문자 전략을 사용하는 방법이 보이지 않습니다.
mikebridge 2013 년

@mikebridge 이것에 대한 해결책을 찾았습니까? 또한 각 열거 형 옵션의 이름을 직접 설정하거나 소문자를 사용하는 방법을 찾고 있습니다.
Timm

1
@Timm 예,이 게시물을 사용했습니다 : stackoverflow.com/questions/6288660/…
mikebridge

@mikebridge 감사합니다. 열거 형 항목 당 [EnumMember (Value = "undefined")]가 JSON.Net에서도 잘 작동 함을 발견했습니다 (Microsoft의 JSON deserializer에서는 지원되지 않음)
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é 2015 년

당신이 나를 구해주었습니다! 감사합니다! 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 직렬화에 완벽하게 작동하는 것 같습니다. 감사!
찰리

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.