如何使用Json.Net反序列化枚举数组?

时间:2014-04-29 13:40:13

标签: c# windows-phone-8 json.net

我有一个像这样的JSON:

[{ 
    "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是一个枚举,而AgencyId的反序列化和序列化可以工作。

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

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

我尝试定义自己的字段转换器,名为ChangeTypeConverter,并将StrinEnumConverter更改为ChangeTypeConverter for 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);
    }
}

2 个答案:

答案 0 :(得分:34)

StringEnumConverter只需要一个枚举值。因为ChangeTypes是一个数组,所以需要对属性进行一些注释以使其工作。

请改为尝试:

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

答案 1 :(得分:2)

无需为序列化/反序列化Enum编写自定义JsonConverter。 不用装饰父模型中的单个属性,只需用StringEnumConverter JsonConverter装饰Enum。

例如:-

以下环境模型具有Shelter枚举属性和枚举Shelter数组[]

public class Environment
{

    public string Name { get; set; }
    public Shelter Shelter { get; set; }
    public Shelter[] Shelters { get; set; }
}

[JsonConverter(typeof(StringEnumConverter)]
public enum Shelter
{
    Indoor,
    Outdoor
}

输出json:-

 {
   "name": "",
   "shelter": "Indoor",
    "shelters": [
       "Indoor",
       "Outdoor"
  ]
 }