簡體   English   中英

從 JSON 反序列化混合類型的無名 arrays

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM