[C#] JavaScriptSerializer-문자열로 열거 형의 JSON 직렬화

enum속성 이 포함 된 클래스가 있고를 사용하여 객체를 직렬화하면 JavaScriptSerializerjson 결과에 string“name”이 아닌 열거의 정수 값이 포함 됩니다. string사용자 정의를 만들지 않고 json에서 열거 형을 얻을 수있는 방법이 JavaScriptConverter있습니까? 아마도 enum정의 또는 객체 속성을 장식 할 수있는 속성이 있습니까?

예로서:

enum Gender { Male, Female }

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

원하는 JSON 결과 :

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

내장 된 .NET 프레임 워크 클래스로 응답을 찾는 것이 이상적입니다 (Json.net과 같은) 가능한 대안은 환영합니다.



답변

사용할 수있는 특별한 속성이 없습니다. 문자열 표현이 아닌 숫자 값으로 JavaScriptSerializer직렬화 enums합니다. enum숫자 값 대신 이름 을 직렬화하려면 사용자 정의 직렬화를 사용해야 합니다.


당신이 JSON.Net 대신 사용할 수있는 경우 JavaScriptSerializer에 비해 참조 이 질문에 답을 에서 제공 OmerBakhari : JSON.net이 사용 (속성을 통해 케이스 포함 [JsonConverter(typeof(StringEnumConverter))]) 및 .NET 시리얼에 내장 처리하지 많은 사람들을. 다음은 시리얼 라이저의 특징과 기능을 비교하는 링크 입니다.


답변

Json.NET이 내가 찾고있는 정확한 기능 을 속성으로 제공 한다는 것을 알았습니다StringEnumConverter .

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

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

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

이 변환기를보다 전역 적으로 구성 할 수있는 다른 장소가 있습니다.

  • 열거 형을 항상 문자열로 직렬화 / 직렬화 해제하려면 열거 형 자체 :

    [JsonConverter(typeof(StringEnumConverter))]
    enum Gender { Male, Female }
  • 누구든지 속성 장식을 피하고 싶다면 JsonSerializer에 변환기를 추가 할 수 있습니다 ( Bjørn Egil 추천 ).

    serializer.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); 

    그리고 그것은 직렬화 중에 보이는 모든 열거에 대해 작동합니다 ( Travis가 제안 함 ).

  • 또는 JsonConverter ( 바나나에서 제안 ) :

    JsonConvert.SerializeObject(MyObject,
        new Newtonsoft.Json.Converters.StringEnumConverter());

또한 StringEnumConverter (NamingStrategy, Boolean) 생성자 를 사용하여 대 / 소문자를 제어 할 수 있습니다 .


답변

c # 열거 형의 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());


답변

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

그러나 임시 직렬화에서도 작동하게하려면 시작 클래스에 다음을 추가하십시오 (예 : 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
}


답변

@ob.의 최상위 답변과 같이 소스 모델을 변경할 수 없었으며 @Iggy와 같이 전역 적으로 등록하고 싶지 않았습니다. 따라서 https://stackoverflow.com/a/2870420/237091 과 @Iggy의 https://stackoverflow.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()
        }
    })


답변

Omer Bokhari와 uri의 대답의 조합은 항상 제공하려는 가치가 일반적으로 열거 형에있는 것과 다르기 때문에 필요에 따라 열거 형을 변경할 수 있기를 원하기 때문에 항상 해결책입니다.

관심있는 사람이라면 다음과 같습니다.

public enum Gender
{
   [EnumMember(Value = "male")]
   Male,
   [EnumMember(Value = "female")]
   Female
}

class Person
{
    int Age { get; set; }
    [JsonConverter(typeof(StringEnumConverter))]
    Gender Gender { get; set; }
}


답변

이것은 쉽게 추가하여 이루어집니다 ScriptIgnore받는 속성 Gender이 직렬화 할 수 없습니다 원인, 특성 및 추가 GenderString부동산 않습니다 직렬화 얻을를 :

class Person
{
    int Age { get; set; }

    [ScriptIgnore]
    Gender Gender { get; set; }

    string GenderString { get { return Gender.ToString(); } }
}