Подтвердить что ты не робот

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 не сможет проанализировать. Как я могу справиться с этой ситуацией?

4b9b3361

Ответ 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)) ?>');