2014-04-29 35 views
10

我有这样一个JSON:如何反序列化使用Json.Net的枚举数组?

[{ 
    "agencyId": "myCity", 
    "road": { 
    "note": "", 
     "lat": "45.321", 
     "lon": "12.21", 
     "streetCode": "290", 
     "street": "street1", 
     "fromNumber": "", 
     "toNumber": "", 
     "fromIntersection": "", 
     "toIntersection": "" 
    }, 
    "changeTypes": ["PARKING_BLOCK", "ROAD_BLOCK"], 
},] 

和一类这样的:

public class AlertRoad : BaseAlert 
{ 
    [JsonProperty("agencyId")] 
    [JsonConverter(typeof(StringEnumConverter))] 
    public AgencyType AgencyId { get; set; } 

    [JsonProperty("changeTypes")] 
    [JsonConverter(typeof(StringEnumConverter))] 
    public ChangeType[] ChangeTypes { get; set; } 

    [JsonProperty("road")] 
    public Road RoadInfo { get; set; } 
} 

AgencyType是一个枚举,并deserializiation和系列化的AgencyId工作。

ChangeType是另一个枚举,但ChangeTypes的反序列化和序列化不起作用。 我假设原因是ChangeTypes是一个枚举值的数组。

问题是:如何反序列化/序列化ChangeTypes字段,或通常枚举值的数组?

我试着通过定义我自己的字段转换器,名为ChangeTypeConverter,并将ChangeTypeConverter的StrinEnumConverter更改为ChangeTypes字段,但在ReadJson函数中,reader的值为null。

public class ChangeTypeConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 

    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var val = reader.Value; 
     //val is null?!? 
     return val; 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(ChangeType); 
    } 
} 

回答

23

StringEnumConverter预计只有一个枚举值。由于ChangeTypes是一个数组,因此您需要对该属性稍加注释才能使其工作。

试试这个:

[JsonProperty("changeTypes", ItemConverterType=typeof(StringEnumConverter))] 
public ChangeType[] ChangeTypes { get; set; }