2012-11-10 4 views
9

これは、障害のあるJSONを管理または修正する方法ではなく、障害のあるJSONの場所をユーザーに説明する方法です。エラーのあるJSONの解析とエラーの表示場所の表示

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

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

障害のあるJSONの組み込みJSONオブジェクトと解析メソッドを使用すると、例外メッセージSyntaxError: Unexpected stringしか取得できません。エラーがどこで発生したのかを知りたい。

好ましい結果はok/errorとエラー位置を返したJSON.validate(json)です。このような何か:

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. 
+0

あなたはエラーが発生した縮小さJSON文字列にインデックスを期待していますか? – Aesthete

+0

はい、そのようなものです。それは、私が推測する大きなJSONの問題への道でもあります。 – javabeangrinder

+0

Yeh ..たぶんこれを読んでもらえます.. https://bugzilla.mozilla.org/show_bug.cgi?id=507998おそらくあなたの質問には答えませんが、なぜこの機能がネイティブに存在する。 – Aesthete

答えて

13

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は、ノードのプロジェクトですが、それはウェブでも使用することができます:単に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 
2

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

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

1

NodeJSを使用している場合、クラリネットは優れたエラーメッセージ(行と列またはエラー)を生成するのに役立つイベントベースのJSONパーサです。私は返すclarinet's parserを使用して小さなユーティリティ構築する必要があり :

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