php json_encode& jquery parseJSON单引号问题

时间:2013-07-29 14:13:58

标签: php jquery

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

我有一个带有json_encode PHP函数的JSON enocded字符串:

{"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 值来自json_encode($var)而$ var是一个数组!

$data = json_encode($var);

5 个答案:

答案 0 :(得分:63)

对于在PHP中传递JSON编码字符串的更广泛问题(例如,通过cURL),使用JSON_HEX_APOS选项是解决此问题的最简洁方法。这也可以解决您的问题,尽管之前的答案是正确的,您不需要需要来调用parseJSON,并且JavaScript对象是相同的,而无需在$data上调用parseJSON。

对于您的代码,您只需进行此更改:

json_encode($var)json_encode($var, JSON_HEX_APOS)

以下是jQuery正确编码数据的示例:http://jsfiddle.net/SuttX/

如需进一步阅读,请参阅PHP.net json_encode manual entry示例#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 constants

答案 1 :(得分:15)

  

然而,当我对JSON编码的字符串进行更改时 - 将反斜杠添加到单引号

在PHP字符串文字中将其转义。然后将其作为简单的'插入到PHP字符串中。

如果要在将其插入JavaScript之前将其转义,则需要在json_encode out 的字符串中添加斜杠(或者更确切地说,因为您没有使用它(你应该!)你手工构建的JSON字符串。

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

var obj = <?=$data?>;

答案 2 :(得分:4)

您面临的问题是您将json_encode调用的结果呈现为javascript为字符串,而它是通过有效的javascript。删除输出中设置的jQuery.jsonParse,只需将回显的结果分配给相关的javascript变量。

var obj = <?= json_encode(array("casts"=>array("Matthew Modine","Adam Baldwin","Vincent D'Onofrio"),"year"=>1987)); ?>;

答案 3 :(得分:1)

如果问题仅涉及单引号,则应该简单明了:

str_replace("'", "\'", json_encode($array));

答案 4 :(得分: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);