Json parse error с двойными кавычками
Двойная кавычка, даже если сбежавшая, бросает ошибку разбора.
посмотрите на код ниже
//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
не сможет проанализировать. Как я могу справиться с этой ситуацией?
Ответы
Ответ 1
Ну, наконец, JSON-анализ использует тот же eval, поэтому нет никакой разницы, когда вы даете им что-л. с неправильным синтаксисом. В этом случае вам нужно правильно убедить свои кавычки в php, а затем избежать их и их сбрасывание с помощью json_encode
<?php
$json = '{"result": ["lunch", "\"Show\""] }';
echo json_encode($json);
?>
OUTPUT: "{\"result\": [\"lunch\", \"\\\"Show\\\"\"] }"
Это должно работать на стороне клиента JS (если я не сделал опечаток).
Ответ 2
Javascript unescapes свои строки и json unescapes их также.
первая строка ('{"result": ["lunch", "\"Show\""] }'
) рассматривается парсером json как
{"result": ["lunch", ""Show""] }
, потому что \"
в javascript означает "
, но не выходит из строки с двойными кавычками.
Вторая строка '{"result": ["lunch", "\\\"Show\\\""] }'
сначала не привязана к {"result": ["lunch", "\"Show\""] }
(и это неправильно отменено json).
Я думаю, что '{"result": ["lunch", "\\"Show\\""] }'
тоже должен работать.
Ответ 3
Эта проблема вызвана механизмом с двумя строками: один из JS и один из JSON.
Комбинация символа обратной косой черты в сочетании с другим следующим символом используется для представления одного символа, который иначе не представлен в строке.
''\\'' означает '\' и т.д.
Этот механизм экранирования происходит до того, как работает JSON.parse().
Например,
var parsedObj = JSON.parse('{"sentence": "It is one backslash(\\\\)"}');
console.log(parsedObj.sentence);
>>>"It is one backslash(\)"
С точки зрения генератора строк он передает четыре зазора '\' в интерпретатор JavaScript.
С точки зрения интерпретатора JavaScript он предполагает, что имеет две затухания (\), поскольку каждая последовательность "\\" будет интерпретироваться как "\".
С точки зрения анализатора JSON он получает два зазора (\\), а правила escape-последовательности строки 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]);
Ответ 4
Из docs
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);
Я не пробовал это, хотя.
Ответ 5
Отключите magic_quotes_gpc
в php.ini.
Ответ 6
php to javascript Object (php >= 5.3.0)
var storesLocations = JSON.parse('<?php echo addslashes(json_encode($storesLocations,JSON_HEX_APOS | JSON_HEX_QUOT)) ?>');