ошибка синтаксического анализа json с двойными кавычками
-
09-09-2019 - |
Вопрос
Двойная кавычка, даже если она экранирована, вызывает ошибку синтаксического анализа.
посмотрите на приведенный ниже код
//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
не сможете разобрать.Как мне справиться с этой ситуацией?
Решение
Ну, наконец, синтаксический анализ JSON использует тот же eval, так что нет никакой разницы, когда вы даете им что-то.с неправильным синтаксисом.В этом случае вам нужно правильно экранировать ваши кавычки в php, а затем экранировать их и их экранирующие косые черты с помощью json_encode
<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo json_encode($json);
?>
OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"
Это должно работать на клиентском JS (если я не допустил опечаток).
Другие советы
Javascript удаляет свои строки, и json также удаляет их.первая строка ( '{"result": ["lunch", "\"Show\""] }'
) рассматривается анализатором json как
{"result": ["lunch", ""Show""] }
, потому что \"
в javascript означает "
, но не завершает строку, заключенную в двойные кавычки.
Вторая строка '{"result": ["lunch", "\\\"Show\\\""] }'
получает первый незащищенный доступ к {"result": ["lunch", "\"Show\""] }
(и это корректно не экранируется json).
Я думаю, что '{"result": ["lunch", "\\"Show\\""] }'
тоже должно сработать.
Эта проблема вызвана механизмом экранирования строки, сложенной вдвое:один исходит из 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]);
Из Документы
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);
Хотя я этого еще не пробовал.
Выключите magic_quotes_gpc
в php.ini.
php в объект javascript (php >= 5.3.0)
var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');
Если будут добавлены стандартные экранирования 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);
}
Это могло бы помочь:
<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo addslashes(json_encode($json));