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