41

我搜索并阅读了大部分相关主题,但它们不是我想要的。

我有一个带有json_encodePHP 函数的 JSON 编码字符串:

{"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;

在这种情况下,Google chrome 控制台会产生什么:

Uncaught SyntaxError: Unexpected identifier 

但是,当我更改 JSON 编码字符串时 - 将反斜杠添加到单引号:

{"casts":["Matthew Modine","Adam Baldwin","Vincent D\'Onofrio"],"year":1987}

控制台输出正常:

Object {casts: Array[3], year: 1987}
casts: Array[3]
year: 1987

问题:控制台中的这个错误是预期的吗?我认为逃避或替换'\'很脏!

更新

实际上$data值来自 ajson_encode($var)而 $var 是一个数组!

$data = json_encode($var);
4

5 回答 5

83

对于在 PHP 中传递 JSON 编码字符串的更广泛的问题(例如,通过 cURL),使用 JSON_HEX_APOS 选项是解决这个问题的最简洁的方法。这也可以解决您的问题,尽管前面的答案是正确的,您不需要调用 parseJSON,并且 JavaScript 对象是相同的,无需调用 parseJSON on $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 常量

于 2013-09-23T19:31:45.653 回答
18

但是,当我更改 JSON 编码字符串时 - 将反斜杠添加到单引号

这会在 PHP 字符串文字中转义它。然后将其作为简单的'.

如果您想在将其插入 JavaScript 之前对其进行转义,那么您需要在您退出的字符串中添加斜杠json_encode(或者更确切地说,因为您没有使用它(您应该使用它!)您手动构建的 JSON 字符串)。

那是比你需要的更多的工作。真正的解决方案是记住 JSON 是 JavaScript 文字语法的一个子集:

var obj = <?=$data?>;
于 2013-07-29T14:16:29.230 回答
5

您面临的问题是您将对 JavaScript 的调用结果显示json_encode为字符串,而它是有效的 JavaScript。从输出中删除jQuery.jsonParse集合,只需将回显的结果分配给相关的 JavaScript 变量。

var obj = <?= json_encode(array("casts"=>array(
    "Matthew Modine","Adam Baldwin","Vincent D'Onofrio"
),"year"=>1987)); ?>;
于 2013-07-29T14:17:05.127 回答
4

如果问题仅与单引号有关,这应该很简单:

str_replace("'", "\'", json_encode($array));
于 2018-09-11T15:37:50.677 回答
0

看看它真的对我有帮助

$products_arr=array();
$products_arr["category"]=array();
 while ($row = $cats->fetch(PDO::FETCH_ASSOC)){

    $product_item=array(
        "id" => $row['id'],
        "title" => json_encode($row['title'])// these will help you
    );

    array_push($products_arr["category"], $product_item);
}

echo json_encode($products_arr);
于 2018-11-01T07:39:01.620 回答