【问题标题】:accessing json data from jquery从 jquery 访问 json 数据
【发布时间】:2010-12-12 22:39:30
【问题描述】:

我正在使用 jQuery 1.4.2 创建一个 ajax 应用程序,并且我尝试使用 get()、post() 和 ajax() 方法本身。我的 php 服务返回:

[{"k":"label0","v":0.5},{"k":"label1","v":99.43},{"k":"label2","v":2.46},{"k":"label3","v":46.29},{"status":"OK"}]

在我的成功回调中,我尝试以 json.status 和 json[0][0] 的身份访问 但它总是返回“未定义”。我做错了什么?

function getSysinfo(source) {
    var json = null;
    $.ajax({
        url: source,
        type: 'POST',
        dataType: 'json',
        success: function (data) {
            json = eval("(" + data + ")");
            $('#data').html(json.status);
            alert(json[0][0]);
            refreshChart(json);
        },
        error: function (request, status, error) {
            alert("REQUEST:\t" + request + "\nSTATUS:\t" + status + 
                  "\nERROR:\t" + error);
        }
    });
    return json;
}

我已经用谷歌搜索了好几天了。我如何访问返回的数据?任何帮助将不胜感激。

【问题讨论】:

  • 我给出了一些可以在你的情况下使用的答案,已经有像 getJSON 这样的方法可以解决所有问题,你可以循环遍历

标签: javascript ajax json jquery


【解决方案1】:

要访问您需要的状态值:

data[4].status

这是因为它是一个对象,存储在数组的第五个元素中,status 是该对象的一个​​属性。

【讨论】:

  • 啊-嗯,这更有意义...我并不太关心状态元素。我需要 k/v 对。我真的只是在试验……我在想 data[1].v 和 data[1][1] 是同义词。谢谢。
【解决方案2】:

您的 JSON 数据如下所示:

[
    {
        "k": "label0",
        "v": 0.5
    },
    {
        "k": "label1",
        "v": 99.43
    },
    {
        "k": "label2",
        "v": 2.46
    },
    {
        "k": "label3",
        "v": 46.29
    },
    {
        "status": "OK"
    }
]

您必须使用

读取您的状态
json[4].status

4 是一个神奇的数字或length-1 - 不可取。我会考虑将您的服务器响应修改为更有用的内容,例如:

{
    "status": "OK",
    "entries": [ ... ] // add your data here
}

【讨论】:

    【解决方案3】:

    在你的成功回调中尝试:

    var parsed = $.parseJSON(data);
    $.each(parsed, function (i, jsondata) {
        alert( jsondata.k );
        alert( jsondata.v );
    });
    

    【讨论】:

    • @lorezo ,我们必须遍历所有元素对吗? .k 和 .v 有什么作用??
    • @gov:你是对的!我错过了循环部分。编辑答案以反映这一点
    • 你不需要像这样解析json,jQuery已经解析好了。
    • 谢谢各位。这看起来很有希望 b/c 我需要遍历数据并将其填充到正确的位置...让我读一点 parseJSON 然后我会玩一会儿。
    【解决方案4】:

    您不需要eval("("+data+")");。 jQuery 会自动为您解析 JSON 响应,因为您指定了 dataType:'json'

    来自 dataType 的 jQuery 文档:

    “json”:将响应评估为 JSON 并返回一个 JavaScript 对象。在 jQuery 1.4 中,JSON 数据以严格的方式解析;任何格式错误的 JSON 都会被拒绝并引发解析错误。 (有关正确的 JSON 格式的更多信息,请参阅 json.org。)

    【讨论】:

    • 没有。坏的。 JSON.parse()。不要将 eval 用于 JSON。不好。
    • 我不提倡使用 eval。我只是说他不需要它。此外,并非所有浏览器(尤其是较旧的浏览器)都支持 JSON.parse。使用像 $.parseJSON 这样基于浏览器做出明智决定的东​​西可能会更好。
    • 我同意 eval() 部分我只是不确定引擎盖下发生了什么。我在谷歌上搜索的一些东西是几年前的。我了解到 jQuery 1.4 内置了它,所以如果我的流是 type='text'.. 时我才需要它。但我会更多地研究 parseJSON()。
    • 哎呀抱歉——我的意思是 dataType='text'
    • 是的,它做到了——我什至不需要其他任何东西。我刚刚修改了我的成功回调以循环它需要进行的更改。我最大的错误是认为 data[0].v 是 data[0][0] 再次感谢。
    【解决方案5】:

    不再需要使用 eval 使用下面的代码可以更多地用于 json

    $.getJSON(url+query,function(json){
                $.each(json,function(i,value){
    
                });
            });
    

    【讨论】:

    • 这不是必需的,问题中的代码已经可以完美地解析 json。此外,$.getJSON 只能用于 GET 请求而不是 POST,因为问题正在使用。
    • 是的,我需要 POST 和 ajax() 也为选项提供了更大的灵活性。感谢您的回复,不过...
    【解决方案6】:

    nategood 已经写到你不需要对数据做任何事情,它已经是一个对象了。

    在这种情况下,它是一个数组,如果你想访问状态,你需要从数据数组的最后一项中检索它(你可以在这个数组中找到它):

      data[data.length-1].status
    

    但也许你应该考虑另一种 JSON 结构,它看起来不太舒服。

    类似的东西:

    {
     "items":[
             {"k":"label0","v":0.5},
             {"k":"label1","v":99.43},
             {"k":"label2","v":2.46},
             {"k":"label3","v":46.29}
            ],
     "status":"OK"
    }
    

    ...应该更容易处理,因为您可以简单地访问 data.status 而不是首先查看在响应中可以找到它的位置(可能容易出错)。

    【讨论】:

    • 我不太关心 2 的状态,但是 k/v 对...我认为响应触发解析可能需要它。我试图把它变成类似于你的结构的东西,但无意中做了和 array_push ($jsonData, array("status" => 'OK')); -- 在 php 方面。无论如何,我需要命名法来正确访问数组...
    • 不过,我非常感谢您的帮助。
    【解决方案7】:

    data 参数是解码后的 JSON,如您在此示例中所见:

    http://www.jsfiddle.net/rLprV/1/

    【讨论】:

      【解决方案8】:
      $.ajax({
              url: url,
              type: 'POST',
              dataType: 'json',
              data: formData,
              showLoader:true,
              success: function (response) {
                  var parsed =  JSON.parse(JSON.stringify(response));
                  $.each(parsed, function (key, val) {
                      alert( val.name );                      
                  });
              },
              error: function (err) {
                  alert("Please enter a valid id")    
              }
           });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-26
        • 2019-01-16
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 2017-12-08
        • 1970-01-01
        相关资源
        最近更新 更多