JSON Parse与否?

时间:2014-03-19 06:10:28

标签: javascript php json

我有一些信息从PHP传递到javascript(不是AJAX调用)来初始化一些动态内容。

在服务器端我有

echo 'var ' . $controlID . '_json = JSON.parse(\'' . $control->getOptions() . '\');';

其中$ control-> getOptions是

public function getOptions() {
    //some code to build an array here
    return json_encode($somearray);
}

导致以下javascript代码浏览器

var ControlName_json = JSON.parse('/*JSON OUTPUT HERE */');

现在,由于某种原因,这会产生错误。 (错误,意外的令牌a)。我查了一下,我正在使用的浏览器都有JSON。 但是,这确实有效:

echo 'var ' . $controlID . '_json = ' . $control->getOptions() ';';

直接将变量指定为对象有什么问题吗?那可能会以某种方式'打破'javascript吗?

为了完整性,导致问题的特定JSON在下面,但是因为它是由json_encode创建的,所以我不确定它是否重要。

{"o0":[{"text":"aguapop","value":"aguapop","selected":false,"parentID":0,"attributes":" value=\"aguapop\""},{"text":"default","value":"default","selected":false,"parentID":0,"attributes":" value=\"default\""},{"text":"fluid","value":"fluid","selected":false,"parentID":0,"attributes":" value=\"fluid\""},{"text":"fresh","value":"fresh","selected":false,"parentID":0,"attributes":" value=\"fresh\""},{"text":"gel","value":"gel","selected":false,"parentID":0,"attributes":" value=\"gel\""},{"text":"professional","value":"professional","selected":false,"parentID":0,"attributes":" value=\"professional\""},{"text":"professional-rtl","value":"professional-rtl","selected":false,"parentID":0,"attributes":" value=\"professional-rtl\""},{"text":"silverwolf","value":"silverwolf","selected":false,"parentID":0,"attributes":" value=\"silverwolf\""},{"text":"wood","value":"wood","selected":false,"parentID":0,"attributes":" value=\"wood\""}]}

3 个答案:

答案 0 :(得分:1)

在JS中,不需要解析JSON,只需将其直接分配给变量即可。使用您的JSON示例为JSfiddle工作:

echo 'var ' . $controlID . '_json = '. $control->getOptions() . ';';

扔进JSON.parse并在意外令牌上失败。

答案 1 :(得分:1)

问题在于解析"attributes"属性,其中没有一个是有效的JSON值,例如你有:

"attributes":" value=\"wood\"

在你的json字符串中,当我把它改为:

"attributes":" value='wood'"

"attributes":" value=\'wood\'"
问题解决了。

另一种方法是不使用JSON.pars e,尽管json中的"attributes"值无法在JSON.parse中解析,但它可能是有效的JavaScript对象,所以你可以这样做:

echo 'var ' . $controlID . '_json = ' . $control->getOptions() . ';';

答案 2 :(得分:1)

您应该将JSON编码为最后一步。运行这个简单的示例,并检查您的JavaScript控制台。

<?php
$cars = array
(
array("Volvo",22,18),
array("BMW",15,13),
array("Saab",5,2),
array("Land Rover",17,15)
);
//print_r($cars);
?>

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>JSON Parse</title>
<script>
var output = '<?php echo json_encode($cars); ?>';
console.log(JSON.parse(output));
</script>
</head>
<body>
</body>
</html>