Итерация через / Анализ JSON-объекта с помощью JavaScript - PullRequest
7 голосов
/ 28 октября 2009

У меня проблема с 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...
  }
});

Насколько я понимаю, это вернет JSON-объект JavaScript? Вот текст, который создает пост 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"
  }
}

Кажется, я не могу понять, как анализировать объект JSON, возвращаемый постом jQuery ajax ... в основном, я хочу пройтись по циклу и сделать div из каждого возвращаемого студента, например, ...

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

Я просто не могу понять, как это сделать ...

Спасибо!

Ответы [ 4 ]

29 голосов
/ 28 октября 2009

Ваш объект 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>")...
 }
4 голосов
/ 28 октября 2009

Есть проблема с этим 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);
  });
});
3 голосов
/ 28 октября 2009

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]...
  }
1 голос
/ 16 октября 2013
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);    
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...