代码之家  ›  专栏  ›  技术社区  ›  mko

使用Json解析枚举集合。净[重复]

  •  0
  • mko  · 技术社区  · 7 年前

    我有这样一个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);
        }
    }
    
    0 回复  |  直到 12 年前
        1
  •  61
  •   Brian Rogers    12 年前

    这个 StringEnumConverter 只需要一个枚举值。因为 ChangeTypes 如果是数组,则需要对属性进行稍微不同的注释,以使其正常工作。

    试试这个:

    [JsonProperty("changeTypes", ItemConverterType=typeof(StringEnumConverter))]
    public ChangeType[] ChangeTypes { get; set; }
    
        2
  •  16
  •   Kappacake    6 年前

    无需编写自定义JsonConverter来序列化/反序列化枚举数组。 与其在父模型中修饰单个属性,不如用StringEnumConverter JsonConverter属性修饰枚举。

    例如:-

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

    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"
      ]
     }