【问题标题】:Parsing JSON from PHP从 PHP 解析 JSON
【发布时间】:2009-07-28 19:26:21
【问题描述】:

我正在尝试迭代从 PHP 脚本返回的 JSON 对象。返回部分类似于:

$json = array("result" => -1, 
    "errors" => array(
    "error1" => array("name" => "email","value" => "err1"),
    "error2" => array("name" => "pass","value" => "err2")
        )
        ); 

$encoded = json_encode($json);
echo $encoded;

所以,在 JavaScript 中我可以做到:

var resp = eval('(' + transport.responseText + ')');
alert(resp.length);
alert(resp.errors.error1.name); 

但我做不到:

alert(resp.errors.length);

我想迭代errors,这就是我试图获得长度的原因。有人可以给我一个提示吗?谢谢!

【问题讨论】:

    标签: php json parsing


    【解决方案1】:

    要做到这一点,您需要 resp.errors 是一个 Javascript 数组,而不是一个 Javascript 对象。

    在 PHP 中,数组可以有命名键;这在 Javascript 中是不可能的;因此,当使用json_encode 时,errors PHP 数组被“转换”为 JS 对象:您的 JSON 数据如下所示:

    {"result":-1,"errors":{"error1":{"name":"email","value":"err1"},"error2":{"name":"pass","value":"err2"}}}
    

    相反,您希望它看起来像这样:

    {"result":-1,"errors":[{"name":"email","value":"err1"},{"name":"pass","value":"err2"}]}
    

    注意“errors”在一个数组中,没有命名键。

    要实现这一点,您的 PHP 代码需要:

    $json = array(
        "result" => -1, 
        "errors" => array(
                array("name" => "email","value" => "err1"),
                array("name" => "pass","value" => "err2")
            )
        ); 
    $encoded = json_encode($json);
    echo $encoded;
    

    (只需删除 errors 上的命名键)

    【讨论】:

    • 您可以使用 for in 循环来迭代对象属性。
    • 同意;但是如果你想使用数组,为什么不使用数组呢? (这样,您就不必使用 hasOwnProperty 等)
    【解决方案2】:

    查看您的 JSON 输出。 resp.errors 会是这样的:

    {"error1": {"name": "email", "value": "err1"}, ...}
    

    如你所见,它是一个对象,而不是一个数组(因为你传递给它的是一个 associative 数组而不是一个数字索引数组。)如果你想在 JavaScript 中循环一个对象,你这样做:

    for (var error in resp.errors) {
        alert(resp.errors[error].name);
    }
    

    如果你希望它是一个 JavaScript 数组,你的 PHP 应该是这样的:

    $json = array("result" => -1, "errors" => array(
        array("name" => "email","value" => "err1"),
        array("name" => "email","value" => "err1")
    ));
    

    【讨论】:

      【解决方案3】:

      如果您在 Firebug 中检查评估对象,您会发现“错误”不是数组而是对象(PHP 中的关联数组转换为 JS 中的对象)。所以你需要使用for-in 语句来遍历一个对象。

      您需要使用hasOwnProperty 检查每个属性名称,以确保它是您发送的内容,而不是某个原型属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-01
        • 1970-01-01
        • 2020-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多