2016-04-19 8 views
1

にすでにある場合、なぜJSON.parseが検出カントが、変数がすでにJSONであり、あなたはそれがエラーをスローすることにJSON.parseをしようとします我々は<code>JSON.parse</code>は文字列化<code>JSON</code>を解析し、知っているように引数はJSON形式

> a 
[] 
> a = JSON.parse(a) 
SyntaxError: Unexpected end of input 
    at Object.parse (native) 
    at repl:1:10 
    at REPLServer.defaultEval (repl.js:132:27) 
    at bound (domain.js:254:14) 
    at REPLServer.runBound [as eval] (domain.js:267:12) 
    at REPLServer.<anonymous> (repl.js:279:12) 
    at REPLServer.emit (events.js:107:17) 
    at REPLServer.Interface._onLine (readline.js:214:10) 
    at REPLServer.Interface._line (readline.js:553:8) 
    at REPLServer.Interface._ttyWrite (readline.js:830:14) 

なぜcant JSON.parseこの引数がすでにJSON objectであることを確認し、エラーを投げる代わりに何もしないのですか?

+0

は、所有者が – Rayon

+0

....開発者がそれを使用するのに十分にスマートであることが予想されマイ:オブジェクトが有効なJSON文字列に変換しているため、以下の例が正常に動作している

同等の作業例
私は問題の1つは、 '[function(){}]'がJSON.parseから返されるということですが、それは_invalid JSON_です。これらのケースをチェックする必要があります。ところで、JSON.parse({toString:function(){return "[1、2、3]";}}) 'のようなエッジケースは、期待される結果。 – Xufox

答えて

5

JSON.parseのECMAドキュメントから、parseメソッドの最初のものは、toString()を使用して最初の引数を文字列化するように見えます。ここでドキュメント自体を確認することができます:http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.2

つまり、JSON.parse([])JSON.parse([].toString())に相当し、JSON.parse("")に相当します。このように見て、エラーunexpected end of inputは実際にははるかに意味があります。空文字列に解析するものは何もありません。

あなたの質問をより直接的に回答するには、JSON.parseがネイティブのJavaScriptオブジェクトをJSON(JSONはjavascriptではない)に推論してシリアライズするためにいくらかのパフォーマンスオーバーヘッドが必要です。さらに、それは単一責任原則(SRP)に違反することになる。オブジェクトではなく文字列を解析するのはJSON.parseです。 obj.toString()または'' + objに相当:JSON.parse(obj)にオブジェクトを渡した場合

1

これはJSON.parseで、JSON.tryParseではありません。あなたが本当に入力を渡す必要があり、文字列化されているかどうかわからない場合は、それを判断する独自のメソッドを開発する必要があります。私はこれをしないとうれしいです。現在の動作はシンプルで、私が愚かなことをしてそれを修正することを知っていれば正しくエラーを投げます。

2

はなぜ有効なJSON
として渡されたオブジェクトを使用し、それを文字列に変換されません。渡されたオブジェクトを有効なJSONとして検証しようとしません。 ''とこれが有効なJSONではありません。エラーが発生したのはなぜ

[]空の配列を持つ
問題は、それが空の文字列に変換していることです。
空の文字列の場合、nullまたはundefined(有効なJSON文字列があるため、JSON.parse('null')または)を返すことはできず、エラーをスローすることは便利なオプションです。
正確なJSON形式をhereにしてください。

JSON.parse({toString: function() {return '{"a": 1}'}}); // prints an object {a: 1} 
JSON.parse([1]); // prints a number 1 
JSON.parse('""') // prints an empty string "" 
関連する問題