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

含嵌套数组的JSON反序列化失败?类型匹配错误求解

解决含嵌套数组的JSON反序列化问题

嘿,这个报错其实已经把问题根源说得明明白白啦!你遇到的核心问题是类型不匹配:你的Bid和Ask类是单个对象的结构,但JSON里的bids/asks字段对应的是嵌套数组(外层是数组,每个元素又是一个数组),反序列化器自然没法把数组塞进单个对象里。

我结合常见的这类JSON结构(比如交易所的订单簿数据),给你两种实用解决方案:

方案一:直接用二维列表接收(最简单)

如果不需要把每个嵌套数组转成强类型对象,直接用List<List<decimal>>(假设数组里是数值类型)来接收bids和asks即可。

类定义示例

public class OrderBook
{
    // 注意字段名要和JSON里的键对应,大小写敏感的话用特性标注
    [JsonPropertyName("bids")] // System.Text.Json 用这个
    // [JsonProperty("bids")] // Newtonsoft.Json 用这个
    public List<List<decimal>> Bids { get; set; }

    [JsonPropertyName("asks")]
    public List<List<decimal>> Asks { get; set; }
}

反序列化代码

// System.Text.Json 写法
var orderBook = JsonSerializer.Deserialize<OrderBook>(yourJsonString);

// Newtonsoft.Json 写法
var orderBook = JsonConvert.DeserializeObject<OrderBook>(yourJsonString);

方案二:自定义转换器转成强类型对象

如果希望把每个嵌套数组(比如[价格, 数量])转成Bid/Ask对象,就需要写一个JSON转换器来处理数组到对象的映射。

1. 定义强类型类

public class Bid
{
    public decimal Price { get; set; }
    public decimal Quantity { get; set; }
}

// Ask和Bid结构一致的话可以直接复用,或者单独定义
public class Ask
{
    public decimal Price { get; set; }
    public decimal Quantity { get; set; }
}

public class OrderBook
{
    [JsonConverter(typeof(BidConverter))]
    public List<Bid> Bids { get; set; }

    [JsonConverter(typeof(AskConverter))]
    public List<Ask> Asks { get; set; }
}

2. 实现JSON转换器(以System.Text.Json为例)

public class BidConverter : JsonConverter<List<Bid>>
{
    public override List<Bid> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        if (reader.TokenType != JsonTokenType.StartArray)
            throw new JsonException("JSON格式错误:预期是数组开头");

        var bids = new List<Bid>();
        while (reader.Read())
        {
            if (reader.TokenType == JsonTokenType.EndArray)
                break;

            // 处理每个嵌套的价格-数量数组
            if (reader.TokenType == JsonTokenType.StartArray)
            {
                decimal price = 0;
                decimal quantity = 0;
                int elementIndex = 0;

                while (reader.Read())
                {
                    if (reader.TokenType == JsonTokenType.EndArray)
                        break;

                    if (elementIndex == 0)
                        price = reader.GetDecimal();
                    else if (elementIndex == 1)
                        quantity = reader.GetDecimal();

                    elementIndex++;
                }

                bids.Add(new Bid { Price = price, Quantity = quantity });
            }
        }
        return bids;
    }

    // 如果不需要序列化回JSON,这个方法可以留空或抛出异常
    public override void Write(Utf8JsonWriter writer, List<Bid> value, JsonSerializerOptions options)
    {
        writer.WriteStartArray();
        foreach (var bid in value)
        {
            writer.WriteStartArray();
            writer.WriteNumberValue(bid.Price);
            writer.WriteNumberValue(bid.Quantity);
            writer.WriteEndArray();
        }
        writer.WriteEndArray();
    }
}

如果用Newtonsoft.Json,转换器写法类似,继承JsonConverter<List<Bid>>,实现ReadJson和WriteJson方法即可。

关键提醒

  • 确保类的字段名和JSON里的键完全对应,大小写敏感的话记得用JsonPropertyName(System.Text.Json)或JsonProperty(Newtonsoft.Json)特性标注。
  • 如果嵌套数组里的元素不是数值类型,记得调整转换器里的类型读取逻辑(比如GetString())。

内容的提问来源于stack exchange,提问作者gorrch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:16:42