【问题标题】:Parsing JSON to something usable将 JSON 解析为可用的东西
【发布时间】:2014-08-19 20:41:15
【问题描述】:

我知道这方面有 100 万和 1 个问题,但我似乎找不到答案。

我正在通过 PHP 接收数据

echo json_encode($result); 

来自典型的 MYSQL 查询。

我在控制台中得到这样的结果。

[{"id" : "1", "name" : "bob"}] 

我正在尝试使用 $.each 对其进行迭代,以便我可以处理我的结果,但我只会收到错误、未定义或 0[object Object].. 之类的东西。

我的目标是将每个值附加到输入框(从表中检索数据以放入编辑框)。

$.post('getstuff.php', { id : id } function(data){
  $.each(data), function(k,v){
    $('input[name= k ]').val(v);
  });
});

如您所见,我希望它像键 => 值对一样简单,但显然不是。我试过解析,stringifiying ..真的我在这一点上迷路了。我也不能告诉 $.post 我正在使用 JSON,因为我使用的是更任意的函数,但我只是将其发布为我的示例。


编辑

            var retrievedData = JSON.parse(data);
        $.each(retrievedData, function(k,v){
            for (var property in retrievedData) {
                if (retrievedData.hasOwnProperty(property)) {
                    console.log(k);
                    console.log(v);
                    console.log(property);
                    //$('input[name= k ]').val(v);
                }
            }
        });

【问题讨论】:

    标签: javascript jquery mysql json


    【解决方案1】:

    在您的第二个代码示例中,retrievedData 是一个数组,您可以使用 jQuery $each 对其进行迭代...

    $.each(retrievedData, function(k, v) {
    

    到目前为止还可以。但是随后您尝试像对象一样再次迭代retrievedData,但事实并非如此。这就是您在控制台中收到未定义消息的原因

    for (var property in retrievedData) {
        if (retrievedData.hasOwnProperty(property)) {
            console.log(k);
            console.log(v);
            console.log(property);
            //$('input[name= k ]').val(v);
        }
    }
    

    在内部循环中,您应该迭代 v 而不是 retrievedData。在 $each v 的每次传递中都会是一个对象。试试这个:

    $.each(retrievedData, function(k,v){    
        for (var key in v) {
            if (v.hasOwnProperty(key)) {
                console.log("key: " + key);
                console.log("value: " + v[key]);
            }
        }
    });
    

    您应该首先检查 v 是否是一个对象并捕获任何错误。

    【讨论】:

    • 谢谢...这简直是地狱。并感谢大家的所有帮助。
    • 为了混淆问题,JavaScript 中的数组实际上是对象。但是你不应该使用 for...in 和他们。值得在这方面做一些阅读。你的帖子引起了我的共鸣,因为我非常清楚地记得未定义的地狱:)
    【解决方案2】:

    使用任一:

    $.ajax({
       'dataType' : 'json'
    });
    

    或者

    $.getJSON
    

    或者如果您想使用 $.post,只需在您的成功函数中执行:

    var good_data = JSON.parse(data);
    $.each(good_data, function(k,v) {
       $('input[name= k ]').val(v);
    });
    

    【讨论】:

    • 我一直在尝试使用 Parse。如果我 console.log(k + v) 我只得到 0[Object object]。此外,如果我 console.log(k);控制台.log(v);我得到 0 然后是对象。我需要从对象中获取键和值。
    【解决方案3】:

    根据您对其他答案的 cmets 回答您的问题。 我的假设是您将数据作为 JSON 获取,如果不需要解析它,您可以使用 JSON.parse(string)。

    这里我使用的是 Underscore.js

     var data=[{"id" : "1", "name" : "bob"}]
       $(data).each(function(ind,obj){
        var keys=_.keys(obj);   
                $(keys).each(function(i,ke){
                    console.log(ke)
                    console.log(obj[ke]);
               })
       });
    

    Here is JSFiddle 的工作代码

    【讨论】:

      【解决方案4】:

      首先,您需要在 POST 请求中定义您期望的 JSON - http://api.jquery.com/jQuery.post/

      然后你需要遍历响应。

      $.post('getstuff.php', { id : id } function(data){
        //Assuming you get your response as [{"id" : "1", "name" : "bob"}], this is an array
        //you need to iterate through it and get the object and then access the attributes in there
        $.each(data), function(item){
          $('input[name=' + item.name + ']').val(item.id);
        });
      }, 'json');
      

      编辑

      如果你想遍历返回的对象的属性,你需要在$.each里面再放一个循环

      for (var property in item) {
          if (object.hasOwnProperty(property)) {
              // do stuff
          }
      }
      

      更多信息在这里 - Iterate through object properties

      编辑 2

      解决您发布的解决方案。您使用了错误的变量名。这是一个有效的小提琴 - http://jsfiddle.net/EYsA5/

      var $log = $('#log');
      var data = '[{"id" : "1", "name" : "bob"}]'; //because we're parsing it in the next step
      var retrievedData = JSON.parse(data);
      
          for (var parentProp in retrievedData) {  //this gets us each object in the array passed to us
              if (retrievedData.hasOwnProperty(parentProp)) {
                  var item  = retrievedData[parentProp];
                  for (var property in item) { //this gives us each property in each object
                      if (item.hasOwnProperty(property)) {
                          console.log(item[property]);
                          $log.prepend("<br>");
                          $log.prepend("Property name is - " + property);
                          $log.prepend("<br>");
                          $log.prepend("Value of property is - " + item[property]);
                          //do stuff
                      }
                  }
              }
          }; 
      

      【讨论】:

      • 我知道这行得通。但是,如果我不想指定每个项目,例如 item.name、item.id 等。如果有大约 10 个不同的列并且我想要更通用的键和值迭代怎么办?
      • @user3697407 如果是这种情况,您只需要在 $.each 循环内进行另一次迭代。我已经更新了答案
      • 谢谢。你能看看我更新的问题吗?我得到 0 作为我的财产。我仍然想尽量避免使用实际的属性名称,这可能吗?
      • @user3697407 是的,这就是我所做的。但是您在代码中使用了错误的变量名,因此它没有引用正确的值。我已经用固定代码更新了我的答案。
      • 谢谢。我已经复制并粘贴了您的代码,检查了错误,但在控制台中没有任何日志。 if 语句返回 false。
      猜你喜欢
      • 2018-08-09
      • 2023-03-08
      • 2021-03-30
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      相关资源
      最近更新 更多