[英]Deserializing mixed-type, no-name arrays from JSON
I am trying to write C# types and deserialization code for this WEB-API method, using Newtonsoft JSON libs for C#: 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 在任意 arrays 中返回無名值 - 而且Ticker
嵌套在另一個名為pair
的元素下。 更糟糕的是,arrays 使用混合類型。 所以我正在訴諸(到目前為止)這樣的事情:
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
class 聲明上工作,大概是使用注釋? 或者,如果我必須深入研究自定義反序列化代碼......那會是什么樣子?
Model:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.