Aman Gupta Aman Gupta - 7 months ago 5
Javascript Question

Why JSON.parse cant detect if argument is already in JSON format

As we know

JSON.parse
parses the stringified
JSON
, but if a variable is already
JSON
and you try to do
JSON.parse
on that it throws an error :

> 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)


Why cant
JSON.parse
verify that argument is already a
JSON object
and do nothing in that case instead of throwing an error?

Answer

From the ECMA docs on JSON.parse, it looks like the first thing the parse method does is stringify the first argument using toString(). You can check the docs themselves here: http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.2.

In other words, JSON.parse([]) is equivalent to JSON.parse([].toString()), which is equivalent to JSON.parse(""). Looking at it this way, the error unexpected end of input actually makes much more sense. There's nothing to parse in an empty string.

Answering your question more directly, it would require some performance overhead for JSON.parse to infer and serialize a native javascript object into JSON (JSON isn't javascript). Furthermore, it would violate the single responsibility principle (SRP). It's the responsibility of JSON.parse to parse strings, not objects.