我正在使用Newtonsoft JSON来解析API的一些输出。但是,API 结果接近 2.5 MB,解析整个文件只是为了找到我需要的数据需要很长时间。下面是 API 输出的代码片段:
{
"response": {
"success": 1,
"current_time": 1416085203,
"raw_usd_value": 0.2,
"usd_currency": "metal",
"usd_currency_index": 5002,
"items": {
"A Brush with Death": {
"defindex": [
30186
],
"prices": {
"6": {
"Tradable": {
"Craftable": [
{
"currency": "metal",
"value": 3,
"last_update": 1414184620,
"difference": -0.165
}
]
}
}
}
},
我的代码应该在 defindex 数组中找到唯一一个对象,该对象是数字为"5021"的项目对象的子对象,并提取货币和值数据。以下是我用来查找数据的代码:
dynamic result = Newtonsoft.Json.JsonConvert.DeserializeObject(priceFile);
int keyprice = 0;
foreach(var items in result.response.items){
foreach(var item in items){
string indexstr = item.defindex.ToString();
if (indexstr.Contains(defindex))
{
foreach(var price in item.prices){
foreach (var quality in price)
{
Console.WriteLine("{0} {1}", quality.Tradable.Craftable[0].value, quality.Tradable.Craftable[0].currency);
keyprice = quality.Tradable.Craftable[0].value;
return keyprice;
}
}
}
}
}
理想情况下,代码最多只需 10 秒即可运行。
我会为响应对象创建一个类,然后使用类似于以下内容的代码。我在 2.8MB 的 json 文件上进行了测试,平均大约 1.2 秒,也尝试使用 fastJSON(有一个 nuget 包) - 它是我找到的最快的解析器。
string fileName = @"c:tempjsonyourfile.json";
string json;
using (StreamReader sr = new StreamReader(fileName))
{
json = sr.ReadToEnd();
}
response myResponse = fastJSON.JSON.ToObject<response>(json);
var item = myResponse.First(i => i.defindex == "5051");
foreach (var price in item.prices)
{
foreach (var quality in price)
{
Console.WriteLine("{0} {1}", quality.Tradable.Craftable[0].value, quality.Tradable.Craftable[0].currency);
keyprice = quality.Tradable.Craftable[0].value;
return keyprice;
}
}