0

Newtonsoft.Json を使用して、テスト ステーションから生成された JSON ログを解析しようとしています。テスト プロセスによって JSON コンテンツがわずかに破損する可能性があるため、破損したデータを解析できる必要があります。より具体的には、パーサーが破損または認識できない文字に遭遇した場合、現在の行をスキップして、次の行で解析を続行したいと考えています。

ライブラリを調べていますが、まだ解決策が見つかりません。パーサーが停止しているスニペットを次に示します。パーサーから独立してストリームを進めることができないようです。

StringBuilder jsonBuffer = new StringBuilder();
jsonBuffer = "...";

StringReader sr = new StringReader(jsonBuffer.ToString());
JsonTextReader jr = new JsonTextReader(sr);
jr.SupportMultipleContent = true;
bool go = true;
while (go) {
    try {
        go = jr.Read();
    } catch (Exception e) {
        Console.Write("Oops! JSON Read Exception: ");
        Console.WriteLine(e.Message);
        // can't continue past here...
    }

    if (!go || jr.TokenType == JsonToken.Undefined) break;

    if (jr.Value != null)
        Console.WriteLine("Token: {0}, Value: {1}", jr.TokenType, jr.Value);
    else
        Console.WriteLine("Token: {0}", jr.TokenType);
}

私がスキップしたいと思っている破損の種類のいくつかの例:

  • "キー": ""二重引用符で囲まれた値""
  • "key": "不完全な値
  • ']' または '}' の欠落などの不完全なオブジェクト

ネストされたオブジェクトをアンロールするには、最後のアイテムがより複雑なロジックを必要とすることはわかっていますが、これは「あると便利」ですが、1 と 2 は必須です。

どんな助けでも大歓迎です!

ありがとう、ジョン

4

1 に答える 1

0

msログファイルへのストラムであると仮定します...

using (StreamReader sr = new StreamReader(ms))
{
    do
    {
        var line = sr.ReadLine();
        try
        {
            JObject obj = JsonConvert.DeserializeObject(line) as JObject;
            obj.Dump();
            Console.WriteLine("Foo: {0}", obj["foo"]);
        }
        catch (JsonReaderException jex)
        {
            Console.WriteLine("MALFORMED: {0}", line);
        }
    }
    while (!sr.EndOfStream);
}

どちらが:

  1. ファイルを読み取り用に開く
  2. 各行を個別に読みます。
  3. 行をオブジェクト (JObject) に解析しようとします
    • 成功すると、プロパティ値をダンプします
    • 失敗時にエラーメッセージを表示
  4. EOF (ファイルの終わり) を確認する
    • EOF でない場合は、手順 2 に戻ります。
    • EOF の場合、終了します。

これにより、障害を通過しながら、ほとんどの行が処理されます。次に、ブロックを変更しcatch{}てより強力な調査を使用するか、ポストログに書き込んでさらに処理することができます。

于 2015-02-03T02:35:30.720 に答える