簡體   English   中英

C#使用JSON.NET從JSON Web API獲取未命名列表

[英]C# Getting unnamed list from json web api using JSON.NET

我目前正在使用JSON.NET從多個Web API獲取信息,如先前的問答中所述。 但是現在我偶然發現了另一種無法解析的Web API,因為我不知道該怎么做。 這是一個: https : //data.bter.com/api/1/tickers

如您所見,它是交易對的json集合。 但是集合本身是未命名的,因此我必須為每個交易對創建一個類,這並不是真正的動態。 我正在使用以下內容來解析網址:

    public static T DownloadSerializedApi<T>(string address) where T : new()
    {
        T newT = new T();
        HttpClient client = new HttpClient();

        using (Stream s = client.GetStreamAsync(address).Result)
        using (StreamReader sr = new StreamReader(s))
        using (JsonReader reader = new JsonTextReader(sr))
        {
            JsonSerializer serializer = new JsonSerializer();

            newT = serializer.Deserialize<T>(reader);
        }

        return newT;
    }

現在,我想將T設置為“ TradingPairs”類,其中將包含所有交易對的列表。 但是我現在所看到的方式,將是一長串的硬編碼對:(

有人願意幫助我嗎? ;)

數據似乎是對象的字典。 您應該返回東西字典。

盡管“東西”可能很難定義。 幸運的是,“材料”的許多特性顯然是所有人共有的。 它們僅相差兩個屬性。 這些屬性似乎具有從字典鍵派生的名稱。 不是最友好的格式,但可行。

首先,我們必須定義類型:

public class Pair
{
    public Tuple<string, string> names { get; set; }
    public Tuple<decimal, decimal> vols { get; set; }

    // common properties
    public bool result { get; set; }
    public decimal last { get; set; }
    public decimal high { get; set; }
    public decimal low { get; set; }
    public decimal avg { get; set; }
    public decimal sell { get; set; }
    public decimal buy { get; set; }
}

並使用輔助方法:

private Pair CreatePair(string name1, string name2, JObject obj)
{
    var pair = obj.ToObject<Pair>();
    pair.names = Tuple.Create(name1, name2);
    // get the vols from the corresponding properties derived from the names
    pair.vols = Tuple.Create(
        obj.Value<decimal>("vol_" + name1),
        obj.Value<decimal>("vol_" + name2)
    );
    return pair;
}

您可以這樣做:

var map = JsonConvert.DeserializeObject<JObject>(json);
var result =
    (from entry in map.Properties()
    let names = entry.Name.Split('_') // get the names
    let obj = entry.Value as JObject
    select CreatePair(names[0], names[1], obj))
    .ToDictionary(x => x.names);

由於屬性名稱的更改,此JSON有點棘手,但是您仍然應該能夠使用通用方法來獲取數據。

我認為我將采取的方法是使一個類代表一個交易對,並使用[JsonExtensionData]功能來解決vol_xxx屬性名稱隨每對改變的事實。 然后反序列化為Dictionary<string, TradingPair>

這是定義類的方法:

public class TradingPair
{
    public string result { get; set; }
    public decimal last { get; set; }
    public decimal high { get; set; }
    public decimal low { get; set; }
    public decimal avg { get; set; }
    public decimal sell { get; set; }
    public decimal buy { get; set; }

    [JsonExtensionData]
    private Dictionary<string, object> vols { get; set; }
}

然后像這樣反序列化數據:

var tradingPairs = DownloadSerializedApi<Dictionary<string, TradingPair>>(url);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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