如何使用 Json.Net 反序列化枚举数组? [英] How do I deserialize an array of enum using Json.Net?

查看:23
本文介绍了如何使用 Json.Net 反序列化枚举数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个这样的 JSON:

I have a JSON like this:

[{ 
    "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 进行反序列化和序列化.

AgencyType is an enumeration, and deserializiation and serialization for AgencyId works.

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

ChangeType is another enumeration, but deserializiation and serialization for ChangeTypes doesn't work. I assume the reason is that ChangeTypes is an array of enumeration values.

问题是:如何反序列化/序列化 ChangeTypes 字段,或者一般来说是一个枚举值数组?

The question is: how can I deserialize/serialize ChangeTypes field, or in general an array of enumeration values?

我尝试通过定义我自己的字段转换器,称为 ChangeTypeConverter,并将 StringEnumConverter 更改为 ChangeTypeConverter for ChangeTypes 字段,但在 ReadJson 函数中,reader 的值为 null.

I tried by defining my own field converter, called ChangeTypeConverter, and changing StrinEnumConverter to ChangeTypeConverter for ChangeTypes field, but in the ReadJson function the value of reader is 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);
    }
}

推荐答案

StringEnumConverter 只需要一个枚举值.因为 ChangeTypes 是一个数组,您需要稍微不同地注释该属性以使其工作.

The StringEnumConverter expects only a single enumeration value. Because ChangeTypes is an array, you need to annotate the property a little differently to make it work.

试试这个:

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

这篇关于如何使用 Json.Net 反序列化枚举数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆