将JSON解析为可用的东西

时间:2014-06-29 06:53:40

标签: javascript jquery mysql json

我知道有100万个问题,但我似乎无法找到答案。

我正在通过PHP接收数据

echo json_encode($result); 

来自典型的MYSQL查询。

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

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

我正在尝试使用$ .each来迭代这个,所以我可以处理我的结果,但我只得到错误,未定义或0 [对象] ......这样的事情。

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

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

正如你所看到的,我希望它像key =>值对一样简单,但显然不是。我试过解析,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);
                }
            }
        });

4 个答案:

答案 0 :(得分:2)

在你的第二个代码示例中,retrievedData是一个数组,你可以使用jQuery $每个迭代...

$.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。每次传递$ 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是一个对象并捕获任何错误。

答案 1 :(得分:1)

使用:

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

或者

$.getJSON

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

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

答案 2 :(得分:1)

首先,您需要在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
                }
            }
        }
    }; 

答案 3 :(得分:1)

根据您对其他答案的评论回答您的问题。 我的假设是你将数据作为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工作代码