2015-06-10 3 views
0

Я получаю этот JSON файл обратно от вызова AJAX:Доступ к объектам JSON из объектов без заголовков в JQuery

[ 
    { 
     "LINKNAME": "Annual Training", 
     "HITS": 1 
    }, 
    { 
     "LINKNAME": "In Focus Newsletter", 
     "HITS": 1 
    }, 
    { 
     "LINKNAME": "NITA (secured)", 
     "HITS": 1 
    }, 
    { 
     "LINKNAME": "Your Current Events", 
     "HITS": 1 
    }, 
] 

Вот мой AJAX вызов:

$(document).ready(function(e) { 
    $.ajax({ 
     method: "GET", 
     url: url, 
    }).done(function(api) { 
     console.log(api); 
     var obj = JSON.parse(api), 
      totRes = Object.keys(obj).length; 
     $.each(obj.children, function (index, value) { 
      alert(value); 
     }); 
    }).fail(function(jqXHR, textStatus) { 
     alert('Service Catalog: Error loading '+jqXHR+' data. Request fail caused by: '+textStatus); 
    }); 
}); 

Мне нужно, чтобы иметь возможность извлеките данные из JSON и используйте их, но поскольку объекты JSON не являются gioven заголовком, я не уверен, как вытеснять данные внутри внутреннего объекта. Заранее спасибо. Пожалуйста, спросите, не понимаете ли вы мой вопрос.

+1

петля над 'массив JSON объекты ', использующие' for/forEach' – Tushar

+0

, нет способа использовать .each, хотя? –

+1

Да, это «массив», иначе вы можете перебирать массив 'Object.keys (obj)'. – Tushar

ответ

1

Ваш JSON - это просто массив простых объектов.

Чтобы перебрать массив, вы можете использовать различные методы. Так как вы используете JQuery, я просто предлагаю $.each:

var arr = JSON.parse(api); 

$.each(arr, function(i, obj) { 
    // access whatever property you want... obj[LINKNAME] or whatever 
}); 

Вы можете также использовать Array.prototype.forEach, или даже просто ваш основной for цикл:

arr.forEach(function(obj) { 
    // obj is the current plain object... e.g. { LINKNAME: 'whatever', HITS: 0 } 
}); 

Я хотел бы также рассмотреть обратить внимание на то, как вы имеете в виду объекты, которые вы получаете. Хотя верно, что массивы являются объектами, а простые объекты - объектами, я, вероятно, буду ссылаться на массив как массив и простой объект как объект. Это связано с тем, что то, что вы получаете в виде JSON, представляет собой объект массива простых объектов (или, проще говоря, массив объектов).

Вызов массива «объект» и ссылающийся на него как obj может смутить вас при чтении кода быстро (да, это хорошая абстракция для потенциальной расширяемости, если вы не всегда получаете массив, но это не так. в данном случае)

Кроме того, один раз у вас есть доступ к объекту в цикле each, вы можете перебрать свойства объекта, если вам нужно (taken from this answer).

var obj = { 
    "a": 1, 
    "b": 2, 
    "c": 3 
}; 

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    // or if (Object.prototype.hasOwnProperty.call(obj,prop)) for safety... 
    alert("prop: " + prop + " value: " + obj[prop]) 
    } 
} 
+0

WOW Total brain fart! Я не понимал, что использую .children при вызове объекта массива. Это было изменение, потому что оно использовалось для отправки XML, и теперь данные поступают как JSON (по большей части по моему желанию), но спасибо за указание ошибки и предоставление исправления JQuery –

+0

@DJERock, без проблем, рад, что это помогло! –

1

во-первых, можно добавить настройку dataType: 'json', когда вы отправляете повторно квест. Таким образом, вы будете иметь api в качестве массива javascript.

После этого вы сможете выполнить итерацию с помощью javascript for.

$.ajax({ 
    method: "GET", 
    url: url, 
    dataType: "json" 
}).done(function(api) { 
    for (var i = 0; i < api.length; i++) { 
    var name = api[i]["LINKNAME"], 
     hits = api[i]["HITS"]; 
    // ... 
    } 
// ... 
1
$(document).ready(function(e) { 
    $.ajax({ 
     method: "GET", 
     url: url, 
    }).done(function(api) { 
     if (api && api.length > 0) { 
      api.forEach(function (item) { 
       console.log(item); // logs whole object 
       console.log('item name %s', item.LINKNAME); 
       console.log('item hits %s', item.HITS); 
      }); 
     } 
    }).fail(function(jqXHR, textStatus) { 
     alert('Service Catalog: Error loading '+jqXHR+' data. Request fail caused by: '+textStatus); 
    }); 
}); 

Вы можете отфильтровать результаты, чтобы убедиться, что вы используете только объекты, которые содержат как «имя_ссылки» и «» HITS довольно легко:

.done(function(api) { 
    if (api && api.length > 0) { 
     var objs = api.filter(function (item) { 
      return item.hasOwnProperty('LINKNAME') && item.hasOwnProperty('HITS'); 
     }); 
     objs.forEach(function (item) { 
      console.log(item); // logs whole object 
      console.log('item name %s', item.LINKNAME); 
      console.log('item hits %s', item.HITS); 
     }); 
    } 
}); 
Смежные вопросы