C#/ Json.Net异常减缓解析

问题描述:

我使用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方法避免例外吗?

我很高兴!

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