2014-11-15 141 views
-2

我正在使用Newtonsoft JSON來解析API的某些輸出。但是,API結果接近2.5 MB,爲了查找我需要的數據而解析出整個文件需要很長時間。下面是API輸出的一個片段:JSON解析需要太長時間

{ 
"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秒即可運行。

+1

現在需要多長時間? (所有break語句中的重點是什麼?如果你只想要第一個元素,只需要第一個元素...) –

+2

'indexstr = item.defindex.ToString();如果(indexstr.Contains(「5021」))..'是如此...比較整數有趣的方式。至少它不會區分55021和5021. –

+0

現在,它需要幾分鐘(超過10分鐘)才能完成。另外,奇怪比較的目的是因爲item.defindex不是int。不過,我相信它是唯一包含這個數字串的defindex。 – gameboyprinter

回答

2

我會爲響應對象創建一個類,然後使用類似於下面的代碼。我測試了一個2.8MB的json文件,平均約1.2秒,也嘗試使用fastJSON(有一個nuget包) - 它是我找到的最快的解析器。

 string fileName = @"c:\temp\json\yourfile.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; 
      } 
     }