12

これは、障害のあるJSONを管理または修正する方法ではなく、障害のあるJSONのどこにエラーがあるかをユーザーに説明する方法です。

JSONのどの位置でパーサーが失敗したかを見つける方法はありますか?

node.jsアプリケーションでこの問題を解決したいので、可能であればそのドメインで回答を保持してください。

組み込みのJSONオブジェクトと障害のあるJSONの解析メソッドを使用すると、例外メッセージのみが表示されますSyntaxError: Unexpected string。エラーが発生した場所を調べたいのですが。

優先されるのはJSON.validate(json)、結果ok/errorとエラー位置を返すものです。このようなもの:

var faultyJsonToParse = '{"string":"value", "boolean": true"}';
var result = JSON.validate(faultyJsonToParse);
if (result.ok == true) {
   console.log('Good JSON, well done!');
} else {
   console.log('The validator found a \'' + result.error + '\' of type \'' + result.errorType + '\' in your JSON near position ' + result.position);
}

上記の望ましい結果は次のようになります。

The validator found a 'SyntaxError' of type 'Unexpected string' in your JSON near position 35.
4

3 に答える 3

15

jsonLintを試してください:

var faultyJsonToParse = '{"string":"value", "boolean": true"}';

try {
    jsonlint.parse(faultyJsonToParse)
} catch(e) {
    document.write('<pre>' + e)
}

結果:

Error: Parse error on line 1:
...ue", "boolean": true"}
-----------------------^
Expecting 'EOF', '}', ',', ']', got 'undefined'

(jsonLintはノードプロジェクトですが、Webでも使用できます。https ://github.com/zaach/jsonlint/blob/master/web/jsonlint.jsを取得するだけです)

@ eh9が示唆しているように、詳細な例外情報を提供するために、標準のjsonパーサーのラッパーを作成することは理にかなっています。

JSON._parse = JSON.parse
JSON.parse = function (json) {
    try {
        return JSON._parse(json)
    } catch(e) {
        jsonlint.parse(json)
    }
}

JSON.parse(someJson) // either a valid object, or an meaningful exception
于 2012-11-10T16:08:13.873 に答える
2

の組み込みバージョンは、JSON.parse()一貫した動作をしません。議論が整形式である場合は一貫性があり、そうでない場合は一貫性がありません。これは、元のJSONライブラリ実装でのこの関数の不完全な仕様に戻ります。例外オブジェクトのインターフェイスが定義されていないため、仕様は不完全でした。そして、この状況はあなたの質問に直接つながります。

現時点で既成のソリューションはわかりませんが、このソリューションでは、エラー処理のためにJSONパーサーを記述して位置情報を追跡する必要があります。これは、(1)最初にネイティブバージョンを呼び出し、(2)ネイティブバージョンが例外をスローする場合は、位置認識バージョンを呼び出して(遅くなります)、例外をスローすることで、既存のコードにシームレスに挿入できます。独自のコードが標準化されています。

于 2012-11-10T15:48:30.850 に答える
2

NodeJSを使用している場合、クラリネットは非常に優れたイベントベースのJSONパーサーであり、より適切なエラーメッセージ(行と列またはエラー)を生成するのに役立ちます。クラリネットのパーサーを使用して、次の値を返す小さなユーティリティを作成しました。

snippet (string): the actual line where the error happened
line (number)   : the line number of the error
column (number) : the column number of the error 
message (string): the parser's error message

コードはここにあります:https ://gist.github.com/davidrapin/93eec270153d90581097

于 2015-04-14T14:58:55.927 に答える