2016-09-28 2 views
2

를 사용하여 내 웹 API 프로젝트의 문자열로 열거 형을 JSON은 직렬화에 Startup.cs :선택적으로 다음 내가 사용하는 기본 JSON 변환

// Configure JSON Serialization 
var jsonSerializationSettings = GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings; 
jsonSerializationSettings.Formatting = Newtonsoft.Json.Formatting.None; 
jsonSerializationSettings.Converters.Add(new Newtonsoft.Json.Converters.StringEnumConverter()); 

이 지금 [JsonConverter(typeof(StringEnumConverter))]

으로 모든 열거 속성을 장식하지 않도록하는 방법 선택적으로 일부 Enum 속성에 대한 전역 serialization 설정을 선택 해제하고 정수로 변환되는 기본 serializer를 사용할 수 있습니까?

+0

이상적으로 전역 설정 대신 필요한 '속성'만 꾸미십시오 –

+0

특정 속성 또는 특정 열거 형을 선택 해제 하시겠습니까? – dbc

+0

@dcb 특정 속성의 경우, 아마도 특성을 사용합니다. – orad

답변

1

당신은 아무것도하지 않는 문제의 특성에 더미 컨버터를 추가 할 수 있습니다

public class NoConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     // Note - not called when attached directly via [JsonConverter(typeof(NoConverter))] 
     throw new NotImplementedException(); 
    } 

    public override bool CanRead { get { return false; } } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanWrite { get { return false; } } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

그런 [JsonConverter(typeof(NoConverter))]를 사용하여 속성에 연결합니다. 이렇게하면 JsonConverter 특성 변환기가 전역 적으로 지정된 변환기를 대체하지만 CanReadCanWrite이 모두 false를 반환하므로 변환이 수행되지 않습니다. 열거 형 모음의 경우 [JsonProperty(ItemConverterType = typeof(NoConverter))]을 사용할 수 있습니다. 당신은 유형을 정의 할 경우, 예를 들어

는 :

public enum Foo { A, B, C } 

public class RootObject 
{ 
    [JsonConverter(typeof(NoConverter))] 
    public Foo FooAsInteger { get; set; } 

    public Foo FooAsString { get; set; } 
} 

그런 다음

var root = new RootObject { FooAsInteger = Foo.B, FooAsString = Foo.B }; 

var json = JsonConvert.SerializeObject(root, Formatting.Indented, new StringEnumConverter()); 

Console.WriteLine(json); 

출력

{ 
    "FooAsInteger": 1, 
    "FooAsString": "B" 
} 

샘플 fiddle를 생성합니다.

관련 문제