通过 JavaScript 遍历/解析 JSON 对象

IT技术 javascript json jquery parsing loops
2021-02-21 12:18:02

我在使用 jQuery/Ajax/JSON 时遇到问题。我正在使用像这样的 jQuery ajax 帖子......

$.ajax({
  type: "POST",
  dataType: "json",
  url: "someurl.com",
  data: "cmd="+escape(me.cmd)+"&q="+q+"&"+me.args,
  success: function(objJSON){
    blah blah...
  }
});

我的理解是这将返回一个 JavaScript JSON 对象?ajax 帖子产生的文本是这样的(我相信这是有效的 JSON)...

{
  "student":{
    "id": 456,
    "full_name": "GOOBER, ANGELA",
    "user_id": "2733245678",
    "stin": "2733212346"
  },
  "student":{
    "id": 123,
    "full_name": "BOB, STEVE",
    "user_id": "abc213",
    "stin": "9040923411"
  }
}

我似乎无法弄清楚如何解析 jQuery ajax 帖子返回的 JSON 对象......基本上我想循环并从每个返回的学生中制作一个 div......

$("<div id=\"" + student.id + "\">" + student.full_name + " (" + student.user_id + " - " + student.stin + ")</div>")

我似乎无法弄清楚该怎么做...

谢谢!

4个回答

您的 JSON 对象不正确,因为它有多个同名的属性。您应该返回一组“学生”对象。

[
   {
     "id": 456,
     "full_name": "GOOBER ANGELA",
     "user_id": "2733245678",
     "stin": "2733212346"
   },
   {
     "id": 123,
     "full_name": "BOB, STEVE",
     "user_id": "abc213",
     "stin": "9040923411"
   }
]

然后你可以迭代它:

 for (var i = 0, len = objJSON.length; i < len; ++i) {
     var student = objJSON[i];
     $("<div id=\"" + student.id + "\">" + student.full_name + " (" + student.user_id + " - " + student.stin + ")</div>")...
 }
这里有一个问题。我相信 JSON 列表中的每个对象都是一个字典。如果我们some_dictionary.attribute在普通 Python 中执行 a ,我们会得到一个AttributeError. 那么它在这里如何有效?它是一种不同的字典,还是根本不像字典?
2021-04-20 12:18:02
感谢您的回答,它有效!然而只是一个问题......我为什么不能只做一个 for(objJSON 的学生){}?我试过了,它不起作用……好吧,不管怎样,它起作用了。再次感谢。
2021-04-26 12:18:02
2021-04-26 12:18:02
我原以为它会起作用,但我更喜欢使用索引迭代数组。
2021-05-01 12:18:02
@SidharthSamant 这是 JavaScript。在 JavaScript 中,您可以使用obj['property']obj.property只要属性名称对于 JavaScript 命名准则有效,就可以引用对象的属性。如果它包含 JavaScript 名称的非法字符,那么您只能使用第一个选项。
2021-05-17 12:18:02

您当前拥有的 JSON 将不起作用,因为第二个“学生”有效地替换了第一个,因为这些只是对象中的属性。

如果您可以控制 JSON 输出,请将其更改为:

{
  "student":[{
    "id": 456,
    "full_name": "GOOBER, ANGELA",
    "user_id": "2733245678",
    "stin": "2733212346"
    },{
    "id": 123,
    "full_name": "BOB, STEVE",
    "user_id": "abc213",
    "stin": "9040923411"
  }]
}

然后你有一个可以循环的数组:

for(var i=0; i<objJSON.student.length; i++) {
  ...objJSON.student[i]...
  }

该 JSON 存在问题 - 外花括号应该是方括号,因为您需要一个列表,而不是一个地图(又名对象)。由于映射中的所有对象都具有相同的键,它不会正确解析 - 在大多数解析器下,最后一个值将覆盖前一个值。

你要:

[
  {
    "id": 456,
    "full_name": "GOOBER, ANGELA",
    "user_id": "2733245678",
    "stin": "2733212346"
  },
  {
    "id": 123,
    "full_name": "BOB, STEVE",
    "user_id": "abc213",
    "stin": "9040923411"
  }
]

或者使用不同键的地图:

{
  "456":{
    "id": 456,
    "full_name": "GOOBER, ANGELA",
    "user_id": "2733245678",
    "stin": "2733212346"
  },
  "123":{
    "id": 123,
    "full_name": "BOB, STEVE",
    "user_id": "abc213",
    "stin": "9040923411"
  }
}

最好使用 $.getJSON,这是 $.ajax 的专用版本,用于此目的。

$.getJSON("someurl.com", function(students) {
  $.each(students, function() { 
    $("<div id=\"" + student.id + "\">" + student.full_name + " (" + student.user_id + " - " + student.stin + ")</div>").appendTo($container);
  });
});
您的第一个建议中有一个错误:您仍然有数组中条目的属性名称(“student”)。修复后将删除downvote。
2021-04-26 12:18:02
var data = '[
  {
      "id": 456,
      "full_name": "GOOBER, ANGELA",
      "user_id": "2733245678",
      "stin": "2733212346"
  },
  {
      "id": 123,
      "full_name": "BOB, STEVE",
      "user_id": "abc213",
      "stin": "9040923411"
   }
]';

$.each(data, function(index, val) {
    alert(val.id);
    alert(val.full_name);
    alert(val.user_id);
    alert(val.stin);    
})