ошибка синтаксического анализа json с двойными кавычками

StackOverflow https://stackoverflow.com/questions/949604

Вопрос

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

//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));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top