C#反序列化JSON嵌套数组结构时持续报错,求解决方案
问题分析
你的核心问题在于:JSON中result下的每个键(如"14400"、"60")对应的值是数组的数组(即List<List<object>>结构),但你定义的实体类(如R_14400、R_60)是单个对象,且反序列化时直接尝试转成List<R_60>,完全未匹配JSON的整体结构。
正确实现方案
步骤1:复用统一的K线数据实体类
所有时间周期的数组结构完全一致,无需重复定义多个同类实体,只需要一个通用类:
public class KlineData { [JsonProperty(Order = 1)] public long CloseTime { get; set; } [JsonProperty(Order = 2)] public decimal Open { get; set; } [JsonProperty(Order = 3)] public decimal High { get; set; } [JsonProperty(Order = 4)] public decimal Low { get; set; } [JsonProperty(Order = 5)] public decimal Close { get; set; } [JsonProperty(Order = 6)] public decimal Volume { get; set; } [JsonProperty(Order = 7)] public decimal QuoteVolume { get; set; } }
步骤2:调整实体类匹配JSON结构
result节点是一个字典,键是时间周期字符串(如"60"),值是KlineData的列表;同时保留Allowance类:
public class RootObject { [JsonProperty("result")] public Dictionary<string, List<KlineData>> Result { get; set; } [JsonProperty("allowance")] public Allowance Allowance { get; set; } } public class Allowance { public int cost { get; set; } public int remaining { get; set; } public long remainingPaid { get; set; } public string account { get; set; } }
步骤3:关联自定义转换器与实体类
你的ObjectToArrayConverter<T>仅支持单个对象与数组的转换,只需将其绑定到KlineData类,反序列化时列表中的每个元素会自动应用转换器:
// 直接在KlineData类上标记转换器 [JsonConverter(typeof(ObjectToArrayConverter<KlineData>))] public class KlineData { // 字段定义同上 }
或者,若不想修改实体类,也可在序列化设置中添加转换器:
var settings = new JsonSerializerSettings { Converters = { new ObjectToArrayConverter<KlineData>() } };
步骤4:完整反序列化并使用数据
现在直接反序列化为RootObject即可,无需单独处理列表:
var root = JsonConvert.DeserializeObject<RootObject>(jsonStr, settings); // 示例:获取60分钟周期的K线数据 if (root.Result.TryGetValue("60", out var kline60)) { foreach (var data in kline60) { Console.WriteLine($"时间: {data.CloseTime}, 收盘价: {data.Close}"); } }
关键修正点
- 用
KlineData统一处理所有时间周期的数据,避免重复定义类 - 用
Dictionary<string, List<KlineData>>匹配result节点的动态键结构 - 确保转换器作用于单个
KlineData对象,列表会自动遍历应用转换逻辑 - 反序列化目标为完整的
RootObject,而非直接转换为局部列表
内容的提问来源于stack exchange,提问作者Kha1ed
相关产品推荐
相关产品推荐

