c# - 从 JSON 反序列化混合类型的无名数组
问题描述
我正在尝试为此 WEB-API 方法编写 C# 类型和反序列化代码,使用 C# 的 Newtonsoft JSON 库:https ://docs.kraken.com/rest/#operation/getTickerInformation
示例 JSON 如下所示:
{
"error": [],
"result": {
"XXBTZUSD": {
"a": [
"52609.60000",
"1",
"1.000"
],
"b": [
"52609.50000",
"1",
"1.000"
],
"c": [
"52641.10000",
"0.00080000"
],
"v": [
"1920.83610601",
"7954.00219674"
],
"p": [
"52389.94668",
"54022.90683"
],
"t": [
23329,
80463
],
"l": [
"51513.90000",
"51513.90000"
],
"h": [
"53219.90000",
"57200.00000"
],
"o": "52280.40000"
}
}
}
对于其他 API 方法,我使用如下代码直接映射到我的类型:
public static Ticker GetTicker(string pair)
{
try
{
return Deserialize<Ticker>GetJObject($"https://api.kraken.com/0/public/Ticker?pair={pair}");
}
catch
{
throw;
}
}
private static T Deserialize<T>(JObject jObject)
{
try
{
var err = jObject["error"];
if (err.HasValues)
{
throw new Exception("Kraken Error" + String.Join(',',err.ToObject<string[]>()));
}
return jObject["result"].ToObject<T>();
}
catch
{
throw;
}
}
但在这种情况下,JSON 在任意数组中返回无名值 - 并且还Ticker
嵌套在另一个名为pair
. 更糟糕的是,数组使用混合类型。所以我正在诉诸(到目前为止)这样的事情:
public class Ticker
{
[JsonProperty("a")]
public float[] ask { get; set; }
[JsonProperty("b")]
public float[] bid { get; set; }
[JsonProperty("c")]
public float[] close { get; set; }
[JsonProperty("v")]
public float[] volume { get; set; }
[JsonProperty("p")]
public float[] volumeWeightedPrice { get; set; }
[JsonProperty("t")]
public int[] trades { get; set; }
[JsonProperty("l")]
public float[] low { get; set; }
[JsonProperty("h")]
public float[] high { get; set; }
[JsonProperty("o")]
public float opening { get; set; }
}
}
我是 NewtonSoft 的 JSON 库的新手,想知道我是否可以让它纯粹在Ticker
类声明上工作,大概是使用注释?或者,如果我必须深入研究自定义反序列化代码......那会是什么样子?
解决方案
模型:
public class Ticker
{
[JsonProperty("a")]
public float[] ask { get; set; }
[JsonProperty("b")]
public float[] bid { get; set; }
[JsonProperty("c")]
public float[] close { get; set; }
[JsonProperty("v")]
public float[] volume { get; set; }
[JsonProperty("p")]
public float[] volumeWeightedPrice { get; set; }
[JsonProperty("t")]
public int[] trades { get; set; }
[JsonProperty("l")]
public float[] low { get; set; }
[JsonProperty("h")]
public float[] high { get; set; }
[JsonProperty("o")]
public float opening { get; set; }
}
public class Result
{
[JsonProperty("XXBTZUSD")]
public Ticker Ticker { get; set; }
}
public class Root
{
public List<object> error { get; set; }
public Result result { get; set; }
}
反序列化:
Root r = JsonConvert.DeserializeObject<Root>(json_text);
Ticker ticker = r.result.Ticker;
使用权:
ticker.ask[0] //52609,6
推荐阅读
- java - 无法识别数值“{userId}”
- java - 为什么 Consumer 或 Supplier 参数需要 {} 用于多个注释
- javascript - 反应钩子不更新组件
- c# - 代码中存在类型为布尔而不是整数的数据类型错误
- mysql - SPRING JPA 中的 SQL 变量
- sql - Spark S3 读取性能
- nginx - 如何重置nginx速率限制
- vue.js - 在 VUE 应用程序上放置 Google 搜索描述的位置?
- flutter - 我正在登录/注册,现在我卡在颤动的注册页面上
- javascript - 使用 javaScript 在 IOS 的 nextjs 项目中禁用捏缩放