含嵌套数组的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
相关产品推荐
相关产品推荐

