2013-03-21 49 views
0

我使用Newtonsoft.Json來解析json字符串。C#/ Json.Net異常減緩解析

我解析的數據包含很多entrys,其中幾個屬性的巨大負載是可選的。

的代碼解析如下:

public bool Parse(string JSONString) 
    { 
     JObject o; 

     try 
     { 
      jResponse = JObject.Parse(JSONString); 
     } 
     catch (JsonReaderException) 
     { 
      return false; 
     } 


     foreach (JObject jResult in jResponse[ParserConstants.ResultsTag]) 
     { 

      MyObject myObject = new MyObject(); 

      try 
      { 
       myObject.Title = (string)jResult[ParserConstants.TitleTag]; 
      } 
      catch 
      { 
       myObject.Title = String.Empty; 
      } 

      // This goes on for like 15 other elements 
      // Some have a continue in catch, thats when the attribute is mandatory 
      // Some have a deeper Structure like jResult[Tag1][Tag2][0][Tag3] 

      Results.Add(c); 
     } 
     return (Results != null && Results.Count > 0); 
    } 

所有這一切工作正常,但解析是非常緩慢的,因爲有很多例外的來了,卻未能值的字段。 (這就是我猜)在解析所有數據時有1200個異常。

例外的是以下幾點:

「System.InvalidOperationException」類型的第一次機會異常出現在Newtonsoft.Json.DLL

我tryed這樣的事情,而不是嘗試捕捉:

if(jResult[TitleTag] != null && jResult[TitleTag].HasValues){ 
    myObject.Title = (string) jResult[TitleTag]; 
} else { 
    myObject.Title = String.Empty; 
} 

不幸的是它沒有解決,數據也無法正確解析。

有人可以幫助我一個替代try-catch方法避免例外嗎?

我很高興!

回答

1

JObject作品IDictionary<string, JToken>所以有它一個TryGetValue方法:

JToken token; 
if (jResult.TryGetValue(TitleTag, out token)) { 
    myObject.Title = (string)token; 
} else { 
    myObject.Title = String.Empty; 
} 
+0

非常感謝工作正常爲止!你有沒有想到我能如何處理更深的結構 - > jResult [Tag1] [Tag2] [0] [Tag3]? – Ostkontentitan 2013-03-21 12:23:27

+1

我想你可以嘗試將一些擴展方法定義爲助手,這樣你就可以編寫像'jResult.TryGet(Tag1).TryGet(Tag2)...'這樣的代碼。擴展方法可以將'null'接受爲'this',這樣就很容易處理沒有你想要的值的情況。 – 2013-03-21 13:36:47