PHP JSON String, экранирование двойных кавычек для вывода JS - PullRequest
37 голосов
/ 18 сентября 2011

Я создаю строку JSON из массива PHP. Я закодировал его, используя json_encode().

$data = array(
    'title' => 'Example string\'s with "special" characters'
);

$data = json_encode( $data );

$data локализуется с помощью wp_localize_script() и доступен через глобальную переменную data.

В файле JS я могу получить доступ к информации следующим образом:

var data     = data.replace( /"/g, '"' ),
    jsonData = jQuery.parseJSON( data );

console.log( jsonData );

В результате получается:

{ "title":"Example string's with "special" characters" }

Ввод этого результата в http://jsonlint.com/ возвращает ошибку. Удаление двойных кавычек вокруг «special» проверяет строку.

Каков наилучший способ создать строку JSON из PHP и правильно экранировать ее для использования в файле JS?

Ответы [ 7 ]

38 голосов
/ 14 ноября 2013

Другим способом было бы закодировать кавычки, используя htmlspecialchars :

$json_array = array(
    'title' => 'Example string\'s with "special" characters'
);

$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8');
25 голосов
/ 06 апреля 2016

Я успешно только что сделал это:

$json = str_replace("\u0022","\\\\\"",json_encode( $phpArray,JSON_HEX_QUOT)); 

json_encode() по умолчанию выйдет из " в \". Но это все равно неправильно JSON для json.PARSE(). Таким образом, добавив параметр JSON_HEX_QUOT, json_encode() заменит " на \u0022. json.PARSE() все равно не понравится \u0022. Итак, нам нужно заменить \u0022 на \\". \\\\\" сбежал \\".

ПРИМЕЧАНИЕ: вы можете добавить опцию JSON_HEX_APOS для замены одинарной кавычки на значение Unicode HEX, если у вас есть проблема с одинарными кавычками в JavaScript.

например: json_encode( $phpArray, JSON_HEX_APOS|JSON_HEX_QUOT ));

18 голосов
/ 27 января 2016

Используйте json_encode($json_array, JSON_HEX_QUOT);, начиная с php 5.3: http://php.net/manual/en/json.constants.php

10 голосов
/ 18 сентября 2011

С http://www.php.net/manual/en/function.json-encode.php#100565

Тем не менее, кавычки "приведут к недопустимому JSON, но это проблема, только если вы используете json_encode () и просто ожидаете, что PHP магически экранирует ваши кавычки.Вы должны сделать побег самостоятельно.

2 голосов
/ 15 сентября 2018

Это решение, которое заботится об одинарных и двойных кавычках:

<?php
$php_data = array("title"=>"Example string's with \"special\" characters");

$escaped_data = json_encode( $php_data, JSON_HEX_QUOT|JSON_HEX_APOS );
$escaped_data = str_replace("\u0022", "\\\"", $escaped_data );
$escaped_data = str_replace("\u0027", "\\'",  $escaped_data );
?>
<script>
// no need to use JSON.parse()...
var js_data = <?= $escaped_data ?>;
alert(js_data.title); // should alert `Example string's with "special" characters`
</script>
1 голос
/ 24 января 2018

Я только столкнулся с этой проблемой, и фактическая проблема заключалась в том, что я забыл добавить надлежащий заголовок application / json, прежде чем выплевывать фактические данные JSON.

header('Content-Type: application/json');
0 голосов
/ 26 апреля 2019

У меня была проблема с пользователями, невинно вводящими €, а некоторые использовали двойные кавычки для определения своего контента. Я подправил пару ответов с этой страницы и других, чтобы окончательно определить мою маленькую маленькую работу

$products = array($ofDirtyArray);
if($products !=null) {
    header("Content-type: application/json");
    header('Content-Type: charset=utf-8');
    array_walk_recursive($products, function(&$val) {
        $val = html_entity_decode(htmlentities($val, ENT_QUOTES, "UTF-8"));
    });
    echo json_encode($products,  JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
}

Я надеюсь, что это помогает кому-то / кому-то это улучшить.

...