0

我在将 JSON 从 PHP 返回到 Javascript 时遇到问题。下面是我创建 JSON 的 PHP:

$environment[] = array('id' => $env, 'adjacencies' => $hostnames);

foreach($hostnames as $hostname) {
        $environment[] = array('id' => $hostname, 'name' => $hostname, 'data' => array());
    }

return json_encode($environment);;

当我将 json_encode 环境打印到文本文件时,它返回为:

[{"id":"Dev","adjacencies":["tb23","tbwag","tbvg","tbut"]},{"id":"tb23","name":"tb23","data":[]},{"id":"tbwag","name":"tbwag","data":[]},{"id":"tbvg","name":"tbvg","data":[]},{"id":"tbut","name":"tbut","data":[]}]

似乎这可以正确打印出来,但是当我将它返回给 Javascript 时,它会以未定义/空值的形式返回。下面是带有 ajax 调用的 javascript:

var ajax = new AJAX();
var args = "id=" + $("#apps").val() + "&env=" + node.id + "&nocache=" + (new Date()).valueOf();
ajax.connect("POST", "http://" + window.location.hostname + "/project/graph/host", args, function(json) {

var output = '';
for (property in json) {
    output += property + ': ' + json[property]+'; ';
}
alert(output);
});

我显然已经尝试了很多不同的方法来让它打印出来,但没有任何运气。在 PHP 中,我尝试了 json_last_error,它返回为“0”,这意味着 JSON 结构没有问题。

最后,我想在 Javascript 中使用以下命令来继续构建我的图表:

var hostNodes = eval('(' + json + ')'); 

对于为什么我不能让它回来的任何帮助,我们将不胜感激!

4

2 回答 2

1

将您的 PHP 代码保存在一个唯一的文件中,该文件接收一个 post 参数,然后构造 json 数组(如果设置),在底部您可以执行

echo json_encode($json);
flush();

我不是纯 javascript 的专业人士,也不熟悉您的方法,但您应该考虑使用 jQuery,至少我会建议一种接收 json 数组的方法,以便您可以轻松使用它(您还要确保数据是 json):

$.ajax(
{
    // Post select to url.
    type : 'post',
    url : 'myPHPAjaxHandler.php',
    dataType : 'json',
    data : 
    {
        'select' : true
    },
    success : function(data)
    {
        // PHP has returned a json array.

        var id, hostname;

        for(var i = 0; i < data.length; i++)
        {
            id = data[i].id;
            hostname = hostname[i].id;
            // Construct a string or an object using the data.

        }
    },
    complete : function(data)
    {
        // Optional.
    }
});

就像我说的那样,您可以决定是否选择它。对于复杂的项目,它可以变得很方便。

于 2013-03-13T13:53:08.450 回答
1

看起来您假设传递给回调函数的数据将是您的 JSON 已经解析为 JS 对象,但我没有看到任何迹象表明会出现这种情况;很可能必须使用 JSON.parse 将原始 JSON 数据解析为 JS 对象(不是 eval() - eval() 非常危险,在使用真正的 JSON 数据时,您应该始终首选 JSON.parse,因为它不允许XSS 风格的攻击,因为它们通常不是“纯”JSON。)

于 2013-03-13T13:55:40.927 回答