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

如何处理Kraken OHLC JSON反序列化C#类时的last字段问题

Kraken OHLC接口JSON反序列化问题

我尝试反序列化Kraken OHLC接口返回的JSON响应,但始终无法正确处理其中的last字段,导致内部的OHLC数组始终返回null。

接口返回的JSON格式如下:

{"error":[],
"result":
        {
            "XXBTZEUR":
                    [
                        [1679269500,"26401.1","26401.1","26211.6","26243.9","26307.1","8.92959425",311],
                        [1679270400,"26253.1","26324.7","26060.2","26242.9","26212.0","33.15872129",520],
                        [1679271300,"26250.1","26276.8","26216.8","26260.4","26259.0","3.63710383",183]
                    ],
            "last":1679915700
        }}

我原本定义的类结构如下,但无论怎么修改,内部数组都返回null:

public class OHLCResponse
{
    [JsonProperty(PropertyName = "error")]
    public List<string> Error;

    [JsonProperty("result")]
    public OHLC Result { get; set; }
}

public class OHLC
{
    //[JsonProperty("ohlc_pairs")]
    public Dictionary<string, List<OHLCPair>> OHLCPairs { get; set; }

    [JsonProperty("last")]
    public int Last { get; set; }
}

public class OHLCPair 
{
    [JsonProperty("time")]
    public int UnixDateStamp { get; set; }
    [JsonProperty("open")]
    public string Open { get; set; }
    [JsonProperty("high")]
    public string High { get; set; }
    [JsonProperty("low")]
    public string Low { get; set; }
    [JsonProperty("close")]
    public string Close { get; set; }
    [JsonProperty("vwap")]                  //volume weighted average price
    public string VWAP { get; set; }
    [JsonProperty("volume")]
    public string Volume { get; set; }
    [JsonProperty("count")]
    public string Count { get; set; }
}

我使用Newtonsoft.Json进行反序列化,调用代码如下:

OHLCResponse cOHLCResponse = _CKraken.GetPublicWebResponse<OHLCResponse>("OHLC", param);

内部反序列化实现:

result = (T)JsonConvert.DeserializeObject<T>(json);

解决方案

问题出在两个核心点:

  1. result对象中的交易对(如XXBTZEUR)是动态键,无法直接映射到OHLC类的OHLCPairs属性
  2. 每个OHLC条目是数组结构而非键值对对象,原OHLCPair类的JsonProperty无法匹配数组元素

修改后的类结构如下:

1. 修改OHLC类,用JsonExtensionData捕获动态交易对

public class OHLC
{
    [JsonExtensionData]
    private Dictionary<string, JToken> _extensionData;

    /// <summary>
    /// 交易对与对应OHLC数据的映射
    /// </summary>
    public Dictionary<string, List<OHLCPair>> OHLCPairs
    {
        get
        {
            return _extensionData?.ToDictionary(
                kvp => kvp.Key,
                kvp => kvp.Value.ToObject<List<OHLCPair>>()
            );
        }
    }

    [JsonProperty("last")]
    public int Last { get; set; }
}

2. 修改OHLCPair类,通过数组构造函数映射元素

public class OHLCPair
{
    public int UnixDateStamp { get; set; }
    public string Open { get; set; }
    public string High { get; set; }
    public string Low { get; set; }
    public string Close { get; set; }
    public string VWAP { get; set; }
    public string Volume { get; set; }
    public int Count { get; set; }

    [JsonConstructor]
    public OHLCPair(JArray array)
    {
        UnixDateStamp = (int)array[0];
        Open = (string)array[1];
        High = (string)array[2];
        Low = (string)array[3];
        Close = (string)array[4];
        VWAP = (string)array[5];
        Volume = (string)array[6];
        Count = (int)array[7];
    }
}

3. OHLCResponse类保持不变

public class OHLCResponse
{
    [JsonProperty(PropertyName = "error")]
    public List<string> Error;

    [JsonProperty("result")]
    public OHLC Result { get; set; }
}

修改后,Newtonsoft.Json会自动完成以下操作:

  • 用JsonExtensionData捕获result中的所有动态交易对键值
  • 通过OHLCPair的构造函数将每个数组条目转换为对象
  • 正确映射last字段

反序列化后,你可以通过cOHLCResponse.Result.OHLCPairs获取交易对的OHLC数据,通过cOHLCResponse.Result.Last获取last值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 22:44:52