无法将字符串解析为JSON对象,无法从javascript中显示警告框

时间:2012-07-25 23:02:46

标签: php javascript html json

编辑:已解决。使用下面的任何解决方案,但需要将document.onload更改为window.onload。无论如何也无需window.onload功能。

这是我正在使用的test.php文件

<?php 
  include("conn.php");
?>

<!DOCTYPE html>
<html>
<head>
  <title>test</title>
</head>
<body>

    <script src="js/jquery.js"></script>
    <script type="text/javascript">
        document.onload = function (){
          var jsonString = '<?php echo json_encode($rowarr); ?>';
          var jsonObj = jQuery.parseJSON( jsonString );
          console.log(jsonObj);
          alert( jsonObj.Auckland );
    };

  </script>
</body>
</html>

我已在Chrome开发者工具中验证了jsonString的值为

'{"Auckland":37616,"Wellington":35357,"Christchurch":29818}'

之后我没有登录控制台或任何警告框。我也试过JSON.parse方法而不是jQuery.parseJSON无济于事。

我正在尝试将此JSON转换为用于google charts geo chart的数据格式,看起来像这段代码

var data = google.visualization.arrayToDataTable([
    ['City',   'Population', 'Area'],
    ['Rome',      2761477,    1285.31],
    ['Milan',     1324110,    181.76],
    ['Naples',    959574,     117.27],
    ['Turin',     907563,     130.17],
    ['Palermo',   655875,     158.9],
    ['Genoa',     607906,     243.60],
    ['Bologna',   380181,     140.7],
    ['Florence',  371282,     102.41],
    ['Fiumicino', 67370,      213.44],
    ['Anzio',     52192,      43.43],
    ['Ciampino',  38262,      11]
  ]);

3 个答案:

答案 0 :(得分:4)

如果你不把它作为一个字符串,它将是一个对象,你不必解析它

var jsonObj = <?php echo json_encode($rowarr); ?>;

而不是

var jsonString = '<?php echo json_encode($rowarr); ?>';
var jsonObj = jQuery.parseJSON( jsonString );

看起来document.onload不会触发/已经触发了?您应该使用window.onload$(document).ready()代替。

答案 1 :(得分:2)

由于您实际上是在实际html页面的script标记内插入带有php echo的JSON,因此它在技术上成为了一个对象文字。无需在JavaScript中执行额外的解析步骤。 因此,在您的情况下,您分配给jsonString的值实际上已经是一个对象。

只有当JSON确实是字符串形式时才需要解析JSON。因此,发送到浏览器的实际脚本部分应如下所示:

      var cities = {"Auckland":37616,"Wellington":35357,"Christchurch":29818};
      console.log(cities);
      alert( cities.Auckland );

您没有收到警告框,因为很可能您的代码会抛出JavaScript错误,并在尝试解析对象后停止执行。

答案 2 :(得分:1)

我想处理函数永远不会被触发:文档对象上没有load事件(参见window.onload vs document.onload)。无论如何,您都不需要等待,因为处理程序中没有与DOM交互的内容 - 您可以在<body>标记的底部执行它(请参阅Is the 'onload' necessary when the code is at the bottom?)。


由于JSON是JavaScript的一个子集,您可以直接将其作为对象文字输出到脚本中:

var jsonObj = <?php echo json_encode($rowarr); ?>;
console.log(jsonObj);
alert( jsonObj.Auckland );

无需解析它。特别是,当你的JSON包含一个未转义的原文时,这会破坏你的字符串文字。