【发布时间】:2022-08-14 18:57:46
【问题描述】:
客观的:使用JSON Utils 为Binance REST API 生成C# 类,以便从交换中反序列化数据。
到目前为止,我已经使用 JSON Utils 实现了所有 C# 类,以便反序列化来自 exhange 的数据。除一个以外的所有(K线/烛台数据)
问题:当我在 JSON Utils 中粘贴下面的代码时,出现错误:无效的 JSON 语法
[
[
1660284300000,
\"323.50000000\",
\"323.70000000\",
\"322.40000000\",
\"322.40000000\",
\"757.16400000\",
1660284599999,
\"244731.13410000\",
536,
\"205.39900000\",
\"66395.15700000\",
\"0\"
]
]
这是有效的 JSON 文件以及如何使用此输出生成 C# 类以反序列化数据?
编辑
根据你的所有陈述(尤其是。怪诞的),如果有人需要,这里是来源:
class B_KlineData
{
public long openTime { get; set; }
public string openPrice { get; set; }
public string highPrice { get; set; }
public string lowPrice { get; set; }
public string closePrice { get; set; }
public string volume { get; set; }
public long closeTime { get; set; }
public string quoteAssetVolume { get; set; }
public long numberOfTrades { get; set; }
public string baseVolume { get; set; }
public string quoteVolume { get; set; }
public string ignore { get; set; }
public static IEnumerable<B_KlineData> ParseBinanceResponse(string json)
{
var jsonDoc = JsonDocument.Parse(json);
var root = jsonDoc.RootElement;
foreach (var array in root.EnumerateArray())
{
yield return new B_KlineData
{
openTime = array[0].GetInt64(),
openPrice = array[1].GetString(),
highPrice = array[2].GetString(),
lowPrice = array[3].GetString(),
closePrice = array[4].GetString(),
volume = array[5].GetString(),
closeTime = array[6].GetInt64(),
quoteAssetVolume = array[7].GetString(),
numberOfTrades = array[8].GetInt64(),
baseVolume = array[9].GetString(),
quoteVolume = array[10].GetString(),
ignore = array[11].GetString()
};
}
}
}
调用方法
var jsonData= await market.KlineCandlestickData(\"BNBUSDT\", Interval.FIVE_MINUTE,null,null,2 );
IEnumerable<B_KlineData> bdata = B_KlineData.ParseBinanceResponse(jsonData);
foreach (var item in bdata)
{
txtLog.Text += item.openTime.ToString() + \"\\n\";
txtLog.Text += item.openPrice.ToString() + \"\\n\";
txtLog.Text += item.highPrice.ToString() + \"\\n\";
txtLog.Text += item.lowPrice.ToString() + \"\\n\";
txtLog.Text += item.closePrice.ToString() + \"\\n\";
txtLog.Text += item.volume.ToString() + \"\\n\";
txtLog.Text += item.closeTime.ToString() + \"\\n\";
txtLog.Text += item.quoteAssetVolume.ToString() + \"\\n\";
txtLog.Text += item.numberOfTrades.ToString() + \"\\n\";
txtLog.Text += item.baseVolume.ToString() + \"\\n\";
txtLog.Text += item.quoteVolume.ToString() + \"\\n\";
txtLog.Text += item.ignore.ToString() + \"\\n\";
}
我不确定是否可以进一步优化此代码?
-
它确实是有效的 JSON。它是一个数组数组。混合字符串值和数字虽然不是很好。根据所使用的序列化程序,它可能会或可能不会出现反序列化问题(JSON.NET 可以将其反序列化为
double[][],但 System.Text.Json 必须先设置NumberHandling = JsonNumberHandling.AllowReadingFromString才能反序列化) -
您可能必须进行一些低级别的 JSON 操作。这不是值的随机组合。每个指标都有具体的含义。并且数组可能用于节省空间(键在不需要时发生)。我怀疑任何自动“对象”反序列化器都可以正确处理这个问题。稍后我将发布一个关于如何处理它的示例。
-
谢谢,我正在尝试以正确的方式定义类,但我不确定我是否做得对
-
顺便说一句,我不认为你能用这个 JSON Utils 东西来实现这一点。它似乎有局限性,这是一个很好的例子。另外,作为旁注:您的
int字段绝对应该是@987654329@。 -
正确,谢谢。我将尝试使用实时数据来查看我是否能够反序列化数据
标签: c# json json-deserialization binance-api-client