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