Php json_encode & jquery parseJSON одинарная кавычка
Я искал и читал большинство связанных тем, но они не были тем, что я искал.
У меня есть JOON enocded string с функцией json_encode
PHP:
{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987}
Я работаю с jQuery, чтобы поместить значения в соответствующие поля, в случае тестирования я сделал следующее:
<script>
var obj = jQuery.parseJSON('<?=$data?>');
console.log(obj);
</script>
Предположим, что это $data:
$data =
<<<END
{"casts":["Matthew Modine","Adam Baldwin","Vincent D'Onofrio"],"year":1987}
END;
В этом случае создается консоль хром хром:
Uncaught SyntaxError: Unexpected identifier
Однако, когда я вношу изменения в закодированную строку JSON - добавление Backslash к отдельной цитате:
{"casts":["Matthew Modine","Adam Baldwin","Vincent D\'Onofrio"],"year":1987}
Вывод консоли как обычно:
Object {casts: Array[3], year: 1987}
casts: Array[3]
year: 1987
Вопрос: эта ожидаемая ошибка в консоли? Я думаю, что побег или замена '
на \'
будет настолько грязным!
ОБНОВЛЕНО
Фактически значение $datastrong > происходит от json_encode($var)
, а $var - массива!
$data = json_encode($var);
Ответы
Ответ 1
Однако, когда я вношу изменения в закодированную строку JSON - добавление обратной косой черты к одиночной кавычки
Это ускользает из строкового литерала PHP. Затем он вставляется в строку PHP как простой '
.
Если вы хотите избежать его, прежде чем вставлять его в JavaScript, вам нужно добавить косые черты в строку, которую вы выберете из json_encode
(вернее, поскольку вы не используете это (вы должны быть!) строка JSON вы создаете вручную).
Это больше работы, чем нужно. Реальное решение состоит в том, чтобы помнить, что JSON является подмножеством синтаксиса буквального текста JavaScript:
var obj = <?=$data?>;
Ответ 2
Для более широкой проблемы передачи JSON-кодированной строки в PHP (например, через cURL) использование параметра JSON_HEX_APOS является самым чистым способом решения этой проблемы. Это также решит вашу проблему, хотя предыдущие ответы верны, что вы не нуждаетесь, чтобы вызвать parseJSON, а объект JavaScript тот же, не вызывая parseJSON на $data
.
Для вашего кода вы просто внесете это изменение:
json_encode($var)
до json_encode($var, JSON_HEX_APOS)
.
Здесь пример правильно закодированных данных, обрабатываемых jQuery: http://jsfiddle.net/SuttX/
Для дальнейшего чтения здесь приведен пример из PHP.net json_encode вручную. Пример # 2:
$a = array('<foo>',"'bar'",'"baz"','&blong&', "\xc3\xa9");
echo "Apos: ", json_encode($a, JSON_HEX_APOS), "\n";
Это выведет:
Apos: ["<foo>","\u0027bar\u0027","\"baz\"","&blong&","\u00e9"]
Полный список констант JSON можно найти здесь: PHP.net JSON константы
Ответ 3
Проблема, с которой вы сталкиваетесь, заключается в том, что вы представляете результаты вызова json_encode для javascript в виде строки, тогда как он является действительным javascript. Удалите набор jQuery.jsonParse из вывода и просто присвойте эхо-результаты переменной javascript, о которой идет речь.
var obj = <?= json_encode(array("casts"=>array("Matthew Modine","Adam Baldwin","Vincent D'Onofrio"),"year"=>1987)); ?>;