如何处理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);
解决方案
问题出在两个核心点:
result对象中的交易对(如XXBTZEUR)是动态键,无法直接映射到OHLC类的OHLCPairs属性- 每个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
相关产品推荐
相关产品推荐

