Ошибка синтаксического анализа JSON с двойными кавычками - PullRequest
47 голосов
/ 04 июня 2009

Двойная кавычка, даже если экранирование вызывает ошибку разбора.
посмотрите на код ниже

//parse the json in javascript  
var testJson = '{"result": ["lunch", "\"Show\""] }';  
var tags = JSON.parse(testJson);  
alert (tags.result[1]);

Это ошибка разбора из-за двойных кавычек (которые уже экранированы).
Даже eval() здесь не сработает.
Но если я убегу с двойной косой чертой, как это:

var result = '{"result": ["lunch", "\\"Show\\""] }';  
var tags = JSON.parse(result);  
alert (tags.result[1]);

тогда все работает нормально.
Почему мы должны использовать двойную косую черту здесь в JavaScript? Проблема в том, что функция PHP json_encode() экранирует двойные кавычки с одной косой чертой (например: \"show\"), которую JSON.parse не сможет проанализировать Как мне справиться с этой ситуацией?

Ответы [ 8 ]

34 голосов
/ 04 июня 2009

Javascript удаляет свои строки, а json - их тоже. первая строка ('{"result": ["lunch", "\"Show\""] }') рассматривается синтаксическим анализатором json как {"result": ["lunch", ""Show""] }, потому что \" в javascript означает ", но не выходит из строки в двойных кавычках.

Вторая строка '{"result": ["lunch", "\\\"Show\\\""] }' получает первый неэкранированный до {"result": ["lunch", "\"Show\""] } (и это правильно экранированный json).

Я думаю, что '{"result": ["lunch", "\\"Show\\""] }' тоже должен работать.

30 голосов
/ 04 июня 2009

Ну, наконец, анализ JSON использует тот же eval, так что нет никакой разницы, когда вы даете им что-то. с неверным синтаксисом. В этом случае вы должны корректно экранировать свои кавычки в php, а затем экранировать их и их экранирующие косые черты с помощью json_encode

<?php
    $json = '{"result": ["lunch", "\"Show\""] }';
    echo json_encode($json);
?>

OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"

Это должно работать на JS на стороне клиента (если я не сделал опечаток).

11 голосов
/ 26 октября 2011

Эта проблема вызвана механизмом экранирования из двух строк: один из JS, а другой из JSON.

Комбинация символа обратной косой черты в сочетании с другим следующим символом используется для представления одного символа , который не может быть представлен иным образом в строке. '\\' 'означает' \ 'и т. д.

Этот механизм экранирования имеет место до того, как JSON.parse () заработает.

Например,

var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}');
console.log(parsedObj.sentence);
>>>"It is one backslash(\)"

С точки зрения строкового генератора, он передает четыре люфта '\' в интерпретатор JavaScript.

С точки зрения интерпретатора JavaScript, он интерпретирует есть две зазоры (\), поскольку каждая последовательность '\\' будет интерпретироваться как одна '\'.

С точки зрения синтаксического анализатора JSON, он получает две обратной засветки (\\), а правила перехода на строковые значения JSON будут анализировать его как один '\', который является выходным результатом.

Объясните вам первый код:

var testJson = '{"result": ["lunch", "\"Show\""] }';
//The real string after sequence escaping in to JS is
//'{"result": ["lunch", ""Show""] }' 
//which is passed into the JSON.parse.
//Thus, it breaks the JSON grammar and generates an error
var tags = JSON.parse(testJson);  
alert (tags.result[1]);
10 голосов
/ 04 июня 2009

Из документов

JSON_HEX_APOS (целое число) Все 'преобразуются в \ u0027
JSON_HEX_QUOT (целое число) Все "преобразуются в \ u0022

json_encode () принимает два аргумента, значение и параметры. Так что попробуйте

json_encode($result, JSON_HEX_QUOT); // or
json_encode($result, JSON_HEX_QUOT | JSON_HEX_APOS);

Я еще не пробовал это.

3 голосов
/ 22 апреля 2010

Отключить magic_quotes_gpc in php.ini .

2 голосов
/ 02 сентября 2014

php to javascript Object (php> = 5.3.0)

var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');
0 голосов
/ 29 марта 2019

Это может помочь:

<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));
0 голосов
/ 25 апреля 2018

Если добавить стандартные escape-символы C, то JSON.parse преобразует последовательности вроде \" в ", \\ в \, \n в перевод строки и т. Д.

'foo\\bar\nbaz"' === JSON.parse('"foo\\\\bar\\nbaz\\""')

В случае нашего проекта:

исходная строка ""{\"lat\":28.4594965,\"lng\":77.0266383}""

После перехода на JSON.parse()

"{"lat":28.4594965,"lng":77.0266383}"

Вкл. 2 и переход на JSON.parse()

{lat: 28.4594965, lng: 77.0266383}

Обратите внимание, что JSON.parse() убрал экранирующие символы вместо преобразования string в object.

После удаления экранирующих символов преобразование строки в объект сработало.

Вот демоверсия:

while (typeof p1 != 'object') {
  p1 = JSON.parse(p1);
  pass++;
  console.log('On pass ', pass, p1);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...