61

我正在从 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/会返回错误。删除 "special" 周围的双引号可以验证字符串。

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

4

7 回答 7

64

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

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

$json_decode = htmlspecialchars(json_encode($json_array), ENT_QUOTES, 'UTF-8');
于 2013-11-14T15:16:49.440 回答
39

我成功地做到了:

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

json_encode()默认情况下会转义"\". 但它仍然是错误的 JSON 对于json.PARSE(). 所以通过添加选项JSON_HEX_QUOTjson_encode()将替换"\u0022. json.PARSE()还是不会喜欢\u0022的。那么我们需要替换\u0022\\". 被\\\\\"逃脱了\\"

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

前任:json_encode( $phpArray, JSON_HEX_APOS|JSON_HEX_QUOT ));

于 2016-04-06T17:43:40.847 回答
34

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

于 2016-01-27T10:58:51.283 回答
6

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

<?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', '\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>
于 2018-09-15T06:03:23.503 回答
3

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

header('Content-Type: application/json');
于 2018-01-24T17:32:39.347 回答
1

我遇到了用户无辜输入€的挑战,有些用户使用双引号来定义他们的内容。我从这个页面和其他页面调整了几个答案,最终定义了我的小解决方法

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

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

于 2019-04-26T01:06:15.403 回答
-1

错误出现在不在 HTML 标记中的脚本上。

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<pre><?php print_r($_POST??'') ?></pre>

<form method="POST">
    <input type="text" name="name"><br>
    <input type="email" name="email"><br>
    <input type="time" name="time"><br>
    <input type="date" name="date"><br>
    <input type="hidden" name="id"><br>
    <textarea name="detail"></textarea>
    <input type="submit" value="Submit"><br>
</form>
<?php 
/* data */
$data = [
            'name'=>'loKESH"'."'\\\\",
            'email'=>'imvsrajput@demo.demo',
            'time'=>date('H:i:00'),
            'date'=>date('Y-m-d'),
            'detail'=>'Try this var_dump(0=="ZERO") \\ \\"'." ' \\\\    ",
            'id'=>123,
        ];
?>
<span style="display: none;" class="ajax-data"><?=json_encode($_POST??$data)?></span>
<script type="text/javascript">
    /* Error */
    // var json = JSON.parse('<?=json_encode($data)?>');
    /* Error solved */
    var json = JSON.parse($('.ajax-data').html());
    console.log(json)
    /* automatically assigned value by name attr */
    for(x in json){
        $('[name="'+x+'"]').val(json[x]);
    }
</script>
于 2020-05-12T04:20:10.490 回答