PHP JSON String,JS输出的双引号转义

问题描述 投票:35回答:7

我正在从PHP数组创建一个JSON字符串。我用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/会返回错误。删除“特殊”周围的双引号可验证字符串。

从PHP创建JSON字符串并正确转义它以在JS文件中使用的最佳方法是什么?

php escaping json double-quotes
7个回答
10
投票

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

也就是说,引用“将产生无效的JSON,但这只是一个问题,如果你使用json_encode()并且只是期望PHP神奇地逃脱你的引号。你需要自己逃避。


36
投票

另一种方法是使用htmlspecialchars对引号进行编码:

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

$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8');

25
投票

我成功地做到了这一点:

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

json_encode()默认会将"转移到\"。但是对于json.PARSE()来说,它仍然是错误的JSON。所以通过添加选项JSON_HEX_QUOTjson_encode()将用"取代\u0022json.PARSE()仍然不会喜欢\u0022。那么我们需要用\u0022替换\\"\\\\\"逃脱了\\"

注意:如果您有javascript单引号问题,可以添加选项JSON_HEX_APOS以使用unicode HEX值替换单引号。

例如:json_encode( $phpArray, JSON_HEX_APOS|JSON_HEX_QUOT ));


18
投票

从php 5.3开始使用json_encode($json_array, JSON_HEX_QUOT);http://php.net/manual/en/json.constants.php


2
投票

这是一个处理单引号和双引号的解决方案:

<?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
投票

我刚遇到这个问题,实际的问题是我忘了在吐出实际的JSON数据之前添加一个正确的application / json头。

header('Content-Type: application/json');

0
投票

用户无辜地输入了€,有些人使用双引号来定义他们的内容。我从这个页面和其他人那里调整了几个答案,最后定义了我的小小解决方案

$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);
}

我希望它可以帮助某人/某人改进它。

© www.soinside.com 2019 - 2024. All rights reserved.