c# - deserialize - json net stringenumconverter




열거 형의 JSON 직렬화 (14)

.Net Core Web Api의 경우 : -

public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddJsonFormatters(f => f.Converters.Add(new StringEnumConverter()));
    ...
}

enum 속성을 포함하는 클래스가 있고 JavaScriptSerializer 사용하여 개체를 serialize 할 때 json 결과에 "name" string 아닌 열거 형의 정수 값이 들어 있습니다. 사용자 정의 JavaScriptConverter 를 만들 필요없이 내 json에서 string 로 열거 형을 가져 오는 방법이 있습니까? 아마도 enum 정의 또는 객체 속성을 꾸밀 수있는 속성이 있습니까?

예로서:

enum Gender { Male, Female }

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

원하는 json 결과 :

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

@이 답변은 C # # enum의 JSON 직렬화를 ASP.NET (웹 API 등)의 문자열로만 설정합니다.

하지만 Ad Hoc 직렬화에서도 작동하게하려면 시작 클래스에 다음을 추가하십시오 (예 : Global.asax Application_Start).

//convert Enums to Strings (instead of Integer) globally
JsonConvert.DefaultSettings = (() =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new StringEnumConverter { CamelCaseText = true });
    return settings;
});

Json.NET 페이지에 대한 추가 정보

또한 특정 텍스트로 직렬화 / 역 직렬화하도록 열거 형 멤버를 지정하려면

System.Runtime.Serialization.EnumMember

다음과 같은 속성 :

public enum time_zone_enum
{
    [EnumMember(Value = "Europe/London")] 
    EuropeLondon,

    [EnumMember(Value = "US/Alaska")] 
    USAlaska
}

ASP.Net 코어의 경우 시작 클래스에 다음을 추가하기 만하면됩니다.

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

Description 특성이있을 때 직렬화에 대한 응답이 없음을 알 수 있습니다.

Description 속성을 지원하는 구현은 다음과 같습니다.

public class CustomStringEnumConverter : Newtonsoft.Json.Converters.StringEnumConverter
{
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        Type type = value.GetType() as Type;

        if (!type.IsEnum) throw new InvalidOperationException("Only type Enum is supported");
        foreach (var field in type.GetFields())
        {
            if (field.Name == value.ToString())
            {
                var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
                writer.WriteValue(attribute != null ? attribute.Description : field.Name);

                return;
            }
        }

        throw new ArgumentException("Enum not found");
    }
}

열거 형 :

public enum FooEnum
{
    // Will be serialized as "Not Applicable"
    [Description("Not Applicable")]
    NotApplicable,

    // Will be serialized as "Applicable"
    Applicable
}

용법:

[JsonConverter(typeof(CustomStringEnumConverter))]
public FooEnum test { get; set; }

newtonsoft.json에 대한 답변입니다.

enum Gender { Male, Female }

class Person
{
    int Age { get; set; }

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

나는 Json.NETStringEnumConverter 속성으로 찾고있는 정확한 기능을 제공한다는 것을 발견했다.

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

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

자세한 내용은 StringEnumConverter 설명서를 참조하십시오 .


문자열을 C # enum의 JSON 직렬화를 위해 global.asax에 아래 코드를 추가하십시오.

  HttpConfiguration config = GlobalConfiguration.Configuration;
            config.Formatters.JsonFormatter.SerializerSettings.Formatting =
                Newtonsoft.Json.Formatting.Indented;

            config.Formatters.JsonFormatter.SerializerSettings.Converters.Add
                (new Newtonsoft.Json.Converters.StringEnumConverter());

실제로 JavaScriptConverter를 사용하여 내장 된 JavaScriptSerializer로이를 수행 할 수 있습니다. enum을 Uri로 변환하면 문자열로 인코딩 할 수 있습니다.

날짜에 대해 이렇게하는 방법을 설명했지만 enum에도 사용할 수 있습니다.

http://blog.calyptus.eu/seb/2011/12/custom-datetime-json-serialization/


아래와 같이 JsonConverter.SerializeObject를 호출하여 JsonSerializerSettings를 만들 수 있습니다.

var result = JsonConvert.SerializeObject
            (
                dataObject,
                new JsonSerializerSettings
                {
                    Converters = new [] {new StringEnumConverter()}
                }
            );

아무도 위의 내용이 충분하지 않을 경우를 대비하여이 과부하로 해결했습니다.

JsonConvert.SerializeObject(objToSerialize, Formatting.Indented, new Newtonsoft.Json.Converters.StringEnumConverter())

이것은 낡은 질문이지만, 나는 단지 기여할 것이라고 생각했다. 내 프로젝트에서는 모든 Json 요청에 대해 별도의 모델을 사용합니다. 모델은 일반적으로 "Json"접두사가있는 도메인 객체와 이름이 같습니다. 모델은 AutoMapper를 사용하여 매핑됩니다. json 모델에서 도메인 클래스의 열거 형인 문자열 속성을 선언하도록하면 AutoMapper가 문자열 프리젠 테이션으로 해석합니다.

당신이 궁금해하는 경우에, inbuilt 시리얼 라이저가 순환 참조를 제공하기 때문에 Json 직렬화 클래스에 대해 별도의 모델이 필요합니다.

희망이 사람을 도움이됩니다.


최상위 답변 (@ob.)과 같은 소스 모델을 변경할 수 없었고 @Iggy처럼 전역으로 등록하고 싶지 않았습니다. 그래서 https://.com/a/2870420/237091 과 @ Iggy의 https://.com/a/18152942/237091 을 결합하여 SerializeObject 명령 자체에서 문자열 열거 변환기를 설정할 수있게했습니다.

Newtonsoft.Json.JsonConvert.SerializeObject(
    objectToSerialize, 
    Newtonsoft.Json.Formatting.None, 
    new Newtonsoft.Json.JsonSerializerSettings()
    {
        Converters = new List<Newtonsoft.Json.JsonConverter> {
            new Newtonsoft.Json.Converters.StringEnumConverter()
        }
    })

JsonConverter 특성을 사용하지 않으려면 JsonSerializer 변환기를 추가 할 수도 있습니다.

string SerializedResponse = JsonConvert.SerializeObject(
     objToSerialize, 
     new Newtonsoft.Json.Converters.StringEnumConverter()
); 

직렬화 중에 보이는 모든 enum 대해 작동합니다.


Newtonsoft.Json 라이브러리를 사용하여이 솔루션의 모든 부분을 Newtonsoft.Json . 열거 형 문제를 수정하고 오류 처리를 훨씬 향상시키고 IIS에서 호스팅되는 서비스에서도 작동합니다. 꽤 많은 코드이므로 여기 GitHub에서 찾을 수 있습니다 : https://github.com/jongrant/wcfjsonserializer/blob/master/NewtonsoftJsonFormatter.cs

Web.config 에 항목을 추가하여 작동하게하려면 https://github.com/jongrant/wcfjsonserializer/blob/master/Web.config 에서 예제 파일을 참조하십시오.





javascriptserializer