[英]How do I deserialize an array of enum using 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是另一个枚举,但是ChangeType的反序列化和序列化不起作用。 我认为原因是ChangeTypes是枚举值的数组。
问题是:如何反序列化/序列化ChangeTypes字段,或者通常如何对枚举值数组进行反序列化?
我尝试通过定义自己的字段转换器(称为ChangeTypeConverter)并将StrinEnumConverter更改为ChangeTypes字段的ChangeTypeConverter进行尝试,但是在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);
}
}
StringEnumConverter
只需要一个枚举值。 因为ChangeTypes
是一个数组,所以您需要对属性进行一些不同的注释以使其起作用。
尝试以下方法:
[JsonProperty("changeTypes", ItemConverterType=typeof(StringEnumConverter))]
public ChangeType[] ChangeTypes { get; set; }
无需编写自定义JsonConverter即可对Enum数组进行序列化/反序列化。 与其装饰父模型中的单个属性,不如使用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"
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.