You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:23:48