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;
}
非常感谢工作正常为止!你有没有想到我能如何处理更深的结构 - > jResult [Tag1] [Tag2] [0] [Tag3]? – Ostkontentitan 2013-03-21 12:23:27
我想你可以尝试将一些扩展方法定义为助手,这样你就可以编写像'jResult.TryGet(Tag1).TryGet(Tag2)...'这样的代码。扩展方法可以将'null'接受为'this',这样就很容易处理没有你想要的值的情况。 – 2013-03-21 13:36:47