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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:35:28