2016-05-21 2 views
2

Я только что получил это в консоли Chrome:JSON.parse разбирает выход JSON.stringify, но не сама строка

JSON.stringify(({wat:"\""})) 
> "{"wat":"\""}" 
JSON.parse(JSON.stringify(({wat:"\""}))) 
> Object {wat: """} 
JSON.parse('{"wat":"\""}') 
> VM34235:1 Uncaught SyntaxError: Unexpected string in JSON at position 9(…) 

Скриншот:

shenanigans

JSON.parse успешно разбирает при передаче выходной JSON.stringify({wat:"\""}) но бросает, когда пытаюсь eval JSON.parse('{"wat":"\""}').

Я звоню в махинации.

+0

Посмотрите на строковое значение ' '{ "ват": "\" "} '. 'Это должно быть довольно ясно, то –

+0

''{" ват ":" \ ""} === '{"wat": "" "}'; // true', вам нужно избежать вашей обратной косой черты –

+0

Если вы посмотрите на вывод консоли (' "{" wat ":" \ ""} "') , вы можете видеть, что это значение не является допустимым строковым литералом, поскольку оно не отображает escape-последовательности. В противном случае это должно было бы выглядеть как '' {\ "wat \": \ "\\\" \ "}" '. Следовательно, вы не можете просто скопировать и вставить вывод в строковый литерал. Что показывает консоль, это строка ** value **. Это может стать более очевидным, если вы введете '' foo \ nbar'' в консоль. –

ответ

5

цитаты символ должен быть экранирован с двойными косыми чертами, как это:

JSON.parse('{"wat":"\\""}') 

Когда он отделался лишь одной обратными косыми чертами, JSON.parse() фактически получает следующее значение для анализа:

{"wat":"""} 

который конечно, недействителен JSON.

+0

Не может ли он просто добавить еще два двойных Qoutes? \ "" " – andersfylling

+0

@sciencefyll: Нет. –

0

Попробуйте добавить 2 обратные косые черты, подобные этому. JS видит \ escape-символ и игнорирует его. Итак:

{wat:"\\""} 
Смежные вопросы