如何将JSON中的数组数组反序列化为自定义.Net类型?
解决JSON数组数组映射到自定义.NET类型的问题
这个问题的核心是JSON里的data子元素是数组结构(比如["20180511",1094391]),但你要映射的DataItem是对象结构(带deldate和value属性),Newtonsoft.Json默认无法自动完成这种结构转换,所以抛出了序列化异常。
下面是两种可行的解决方案:
方案一:自定义JsonConverter(推荐,适合需要自定义类的场景)
我们可以写一个自定义的转换器,告诉Newtonsoft.Json如何把JSON数组转换成DataItem对象:
1. 实现JsonConverter
public class DataItemConverter : JsonConverter<DataItem> { public override DataItem ReadJson(JsonReader reader, Type objectType, DataItem existingValue, bool hasExistingValue, JsonSerializer serializer) { // 加载JSON数组 var array = JArray.Load(reader); // 校验数组长度是否符合预期 if (array.Count != 2) { throw new JsonSerializationException("每个DataItem对应的JSON数组必须包含2个元素"); } // 将数组元素映射到DataItem的属性 return new DataItem { deldate = array[0].ToString(), value = array[1].ToObject<int>() }; } public override void WriteJson(JsonWriter writer, DataItem value, JsonSerializer serializer) { // 如果需要将DataItem序列化回JSON数组,实现这个方法 writer.WriteStartArray(); writer.WriteValue(value.deldate); writer.WriteValue(value.value); writer.WriteEndArray(); } }
2. 给DataItem类标记转换器
[JsonConverter(typeof(DataItemConverter))] public class DataItem { public string deldate { get; set; } public int value { get; set; } }
3. 保持TheData类不变
public class TheData { [JsonProperty(PropertyName = "data")] public List<DataItem> dataItems { get; set; } }
现在运行你的测试代码就能正常反序列化了:
string json = "{\"data\":[[\"20180511\",1094391],[\"20180504\",1097315],[\"20180427\",1100221],[\"20180420\",1094455],[\"20180413\",1093023]]}"; var myObj = JsonConvert.DeserializeObject<TheData>(json);
方案二:使用Tuple简化(适合不需要自定义类的场景)
如果不需要自定义DataItem类,可以直接用Tuple<string, int>来接收数据,Newtonsoft.Json会自动映射数组到Tuple:
public class TheData { [JsonProperty(PropertyName = "data")] public List<Tuple<string, int>> dataItems { get; set; } }
这种方式不需要额外写转换器,代码更简洁,但灵活性不如自定义类。
内容的提问来源于stack exchange,提问作者GinjaNinja
相关产品推荐
相关产品推荐

