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

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

Вопрос: эта ожидаемая ошибка в консоли? Я думаю, что побег или замена ' на \' будет настолько грязным!

ОБНОВЛЕНО

Фактически значение $data​​strong > происходит от json_encode($var), а $var - массива!

$data = json_encode($var);
4b9b3361

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