如何反序列化同时含数组与对象类型的images节点JSON数据?
解决方案
要兼容images字段的数组和对象两种形态,最可靠的方式是自定义JSON转换器,在反序列化时根据字段类型动态处理。以下是具体实现步骤:
1. 调整类结构
优化类定义,用Dictionary<string, List<White>>统一接收images的两种形态(空数组对应空字典,对象对应键值对),更贴合JSON实际结构:
public class TestClass { public List<Variant> variants { get; set; } } public class Variant { public string name { get; set; } public string description { get; set; } // 标记使用自定义转换器 [JsonConverter(typeof(ImagesConverter))] public Dictionary<string, List<White>> images { get; set; } } public class White { public string id { get; set; } public string product_id { get; set; } }
2. 实现自定义JSON转换器
创建继承自JsonConverter<T>的转换器,判断images的Token类型并分别处理:
public class ImagesConverter : JsonConverter<Dictionary<string, List<White>>> { public override Dictionary<string, List<White>> ReadJson(JsonReader reader, Type objectType, Dictionary<string, List<White>> existingValue, bool hasExistingValue, JsonSerializer serializer) { // 处理空数组情况 if (reader.TokenType == JsonToken.StartArray) { reader.Skip(); // 跳过整个空数组节点 return new Dictionary<string, List<White>>(); } // 处理对象类型情况 else if (reader.TokenType == JsonToken.StartObject) { return serializer.Deserialize<Dictionary<string, List<White>>>(reader); } // 其他未知类型返回空字典 return new Dictionary<string, List<White>>(); } // 可选:处理序列化逻辑 public override void WriteJson(JsonWriter writer, Dictionary<string, List<White>> value, JsonSerializer serializer) { if (value == null || !value.Any()) { writer.WriteStartArray(); writer.WriteEndArray(); } else { serializer.Serialize(writer, value); } } }
3. 执行反序列化
直接用原有代码完成反序列化,转换器会自动适配两种images形态:
var items = JsonConvert.DeserializeObject<TestClass>(content);
补充:保留原List<Image>结构的适配方案
如果要坚持使用原有的List<Image>定义,可修改转换器逻辑:
public class ImagesConverter : JsonConverter<List<Image>> { public override List<Image> ReadJson(JsonReader reader, Type objectType, List<Image> existingValue, bool hasExistingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.StartArray) { reader.Skip(); return new List<Image>(); } else if (reader.TokenType == JsonToken.StartObject) { var dict = serializer.Deserialize<Dictionary<string, List<White>>>(reader); return dict.Select(kv => new Image { White = kv.Value }).ToList(); } return new List<Image>(); } public override void WriteJson(JsonWriter writer, List<Image> value, JsonSerializer serializer) { if (value == null || !value.Any()) { writer.WriteStartArray(); writer.WriteEndArray(); } else { var dict = value.ToDictionary(img => "WHITE", img => img.White); serializer.Serialize(writer, dict); } } }
此时Variant类的images属性保持原定义,只需添加[JsonConverter(typeof(ImagesConverter))]特性即可。
内容的提问来源于stack exchange,提问作者Naw
相关产品推荐
相关产品推荐

