0

Newtonsoft.Jsonを使用してjson文字列を解析します。

私が解析しているデータには多くのエントリが含まれていますが、それらのいくつかはオプションです。

解析のコードは次のようになります。

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の例外のようなものがあります。

例外は次のとおりです。

Newtonsoft.Json.DLLでタイプ「System.InvalidOperationException」の最初のチャンスの例外が発生しました

try catchの代わりに次のようなものを試しました:

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

残念ながら、それはうまくいかず、データを適切に解析できませんでした。

誰かが例外を回避するtry-catchアプローチの代替案を手伝ってくれるでしょうか?

嬉しいです!

4

1 に答える 1

1

JObjectその上にメソッドIDictionary<string, JToken>があるように動作します:TryGetValue

JToken token;
if (jResult.TryGetValue(TitleTag, out token)) {
    myObject.Title = (string)token;
} else {
    myObject.Title = String.Empty;
}
于 2013-03-21T11:42:06.217 に答える