2

我有一个从 api 调用返回的 json 数组,如下所示:

["meta", {"previous"=>nil, "total_count"=>12, "offset"=>0, "limit"=>1, "next"=>"/v1/Account/MAMTE4MTHJNJRKODBIMD/AvailableNumberGroup/?prefix=415&limit=1&country_iso=US®ion=NY&offset=1"}]["api_id", "441d610c-bede-11e2-815d-22000abcc0e1"]["objects", [{"stock"=>57, "voice_enabled"=>true, "region"=>"New York, UNITED STATES", "voice_rate"=>"0.00900", "prefix"=>"631", "sms_rate"=>"0.00800", "number_type"=>"local", "setup_rate"=>"0.00000", "rental_rate"=>"0.80000", "group_id"=>"11411650673450", "sms_enabled"=>true, "resource_uri"=>"/v1/Account/MAMTE4MTHODBIMD/AvailableNumberGroup/11411650673450/"}]]

我可以用这个打印整个数组

success: function(response){
             $.each([response], function(i, objects) {
             var list = "<li>" + objects + "</li>";
             $('#result').append(list);
             });

如何提取指定的项目并在其中打印它们<li> .. </li>以列出一些但不是所有元素的列表?

非常感谢!

4

4 回答 4

2

您可以通过访问“ i ”来做到这一点。这将拥有所有 JSON 对象的属性。

success: function(response){
             $.each([response], function(i, objects) {
             var list = "<li>" + **i.previous** + "</li>";

             $('#result').append(list);
             });

另一个例子

var obj = {
  "flammable": "inflammable",
  "duh": "no duh"
};
$.each( obj, function( key, value ) {
  alert( key + ": " + value );
});

输出是:

flammable: inflammable 
duh: no duh
于 2013-05-17T10:50:14.963 回答
1

您需要两次迭代,一个用于每个对象,一个用于对象objects[]的每一<key, value>对。

例如在这个演示中,使用来自http://plivo.com/docs/api/numbers/availablenumbergroup/的示例

var jsonResponse = '{"meta": {"previous": null, "total_count": 1, "offset": 0, "limit": 20, "next": null }, "api_id": "26590c12-5831-11e1-86da-6ff39efcb949", "objects": [{"voice_enabled": true, "voice_rate": "1.1"}, {"voice_enabled": false, "voice_rate": "1.2"} ] }';

$('#simulateAjax').on('click', function() {
    // cannot make call due to cross-domain security (and the API URL is unknown!) so just fake call the success function with valid JSON
/*    $.ajax({
      url: 'test.html',
      dataType: 'json'
    }).done(success);
*/
    success($.parseJSON(jsonResponse));

    function success(response) {
        var items = '';
        $.each(response.objects, function(index, obj) {
            // obj here is one "object", we need to iterate the contents of each "obj"

            $.each(obj, function(k, v) {
                // k here is the key
                // v is the value
                items += '<li>' + k + ' : ' + v + '</li>';
            });
        });
        $('#result').append(items);
    }
    return false;
});

这将产生

  • 语音启用:真
  • 语音速率:1.1
  • 语音启用:假
  • 语音速率:1.2

注意:我为演示删除了每个对象中的大部分属性。jQuery 也会自动调用$.parseJson()响应,这就是我手动调用它的原因。

如果您希望每个对象都出现在单个对象上,<li>则需要<li>在外部循环中构造 the 并将kv附加到内部循环中$.each(),然后关闭</li>后面,如下所示:

var item = '<li>';

$.each(obj, function(k, v) {
    item += k + ' : ' + v + ', ';
});

item += '</li>';
items += item;
于 2013-05-17T12:49:45.790 回答
1
var arr = ["meta", {"previous"=>nil, "total_count"=>12, "offset"=>0, "limit"=>1, "next"=>"/v1/Account/MAMTE4MTHJNJRKODBIMD/AvailableNumberGroup/?prefix=415&limit=1&country_iso=US®ion=NY&offset=1"}]["api_id", "441d610c-bede-11e2-815d-22000abcc0e1"]["objects", [{"stock"=>57, "voice_enabled"=>true, "region"=>"New York, UNITED STATES", "voice_rate"=>"0.00900", "prefix"=>"631", "sms_rate"=>"0.00800", "number_type"=>"local", "setup_rate"=>"0.00000", "rental_rate"=>"0.80000", "group_id"=>"11411650673450", "sms_enabled"=>true, "resource_uri"=>"/v1/Account/MAMTE4MTHODBIMD/AvailableNumberGroup/11411650673450/"}]];

    for(var i=0;i<arr.length;i++){
        var obj = arr[i];
        for(var key in obj){
            var attrName = key;
            var attrValue = obj[key];
            //your condition goes here then append it if satisfied
            var list = "<li>" + obj[key]+ "</li>";
            $('#result').append(list);
        }
    }

谢谢。

于 2013-05-17T10:54:06.310 回答
-1

首先,这不是有效的 JSON,因为不允许使用箭头语法 =>,您还应该在值中添加双引号。此外,语法似乎不是很一致,看起来您在根级别有多个数组。要使其成为 JSON,您需要“键”:“值”格式,而“元”没有值。

如果可以,您需要将其更改为:

{ "meta" : { "previous" : "nil", "total_count" : "12" (...) } }

如果您需要“元”内的多组数据:

{ "meta" : [ { "previous" : "nil", "total_count" : "12" (...) }, (...) ] }

之后你可以做(​​第一个选项):

function(json) {
  var key, $result = $('#result');
  for (key in json.meta) {
    $result.append("<li>" + json.meta[key] + "</li>")
  }
}

或(第二个选项):

function(json) {
  var item, key, $result = $('#result');
  for (item in json.meta) {
    for (key in json.meta[item]) {
      $result.append("<li>" + json.meta[item][key] + "</li>")
    }
  }
}
于 2013-05-17T10:53:09.930 回答