2014-04-29 9 views
10

Mam JSON tak:W jaki sposób deserializować tablicę wyliczeń przy użyciu 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"], 
},] 

i klasę tak:

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 jest wyliczenie i deserializiation i serializacji dla AgencyId działa.

ChangeType to kolejne wyliczenie, ale deserializacja i serializacja dla ChangeTypes nie działa. Zakładam, że powodem jest to, że ChangeTypes to tablica wartości wyliczeniowych.

Pytanie brzmi: w jaki sposób można deserializować/serializować pole ChangeTypes lub ogólnie tablicę wartości wyliczeniowych?

Próbowałem przez zdefiniowanie mojego własnego konwertera pól o nazwie ChangeTypeConverter i zmianę parametru StrinEnumConverter na ChangeTypeConverter dla pola ChangeTypes, ale w funkcji ReadJson wartość czytnika jest zerowa.

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); 
    } 
} 

Odpowiedz

23

Numer StringEnumConverter oczekuje tylko jednej wartości wyliczeniowej. Ponieważ ChangeTypes jest tablicą, musisz nieco opisać właściwość, aby działała.

Spróbuj to zamiast:

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