2014-11-14 2 views
0

Я работаю с результатами api, которые дают мне JSON-файл. При этом мне нужно просмотреть файл и найти конкретное свойство. Поэтому я нажимаю JSON в пустой массив, перебираю его и получаю первый объект. Это отлично работает. Там, где я немного тупик, внутри массива все объекты из файла JSON хранятся в одном большом объекте. Поэтому, естественно, я решил, что мне придется затем перебрать этот объект, чтобы попасть внутрь него, но когда я пытаюсь, я ничего не получаю. Нужен ли мне дополнительный цикл для этого? Я включу все, что могу ниже. Кроме того, я искал высоко и низко для решения этого, поэтому извиняюсь, если это дубликат. Если это так, я более чем доволен простой ссылкой для чтения. Спасибо за вашу помощь.Поиск объектов в файле JSON

JSON:

{ 
    "0":{ 
     "person_id":"001583133371", 
     "source":"lexis", 
     "phone_number":"", 
     "first_name":"Brian", 
     "middle_name":"JOSEPH", 
     "last_name":"Name", 
     "aliases":[ 
     { 
      "first_name":"B", 
      "middle_name":"", 
      "last_name":"Name" 
     }, 
     { 
      "first_name":"Brianj", 
      "middle_name":"", 
      "last_name":"Name" 
     }, 
     { 
      "first_name":"Brian", 
      "middle_name":"J", 
      "last_name":"Name" 
     }, 
     { 
      "first_name":"Brian", 
      "middle_name":"J", 
      "last_name":"Name" 
     } 
     ], 
     "street":"", 
     "city":"Newbury Park", 
     "state":"CA", 
     "zip":"91320", 
     "priorAddresses":[ 
     { 
      "street":"", 
      "city":"Sacramento", 
      "state":"CA" 
     }, 
     { 
      "street":"", 
      "city":"Las Cruces", 
      "state":"NM" 
     }, 
     { 
      "street":"", 
      "city":"Big Bear Lake", 
      "state":"CA" 
     }, 
     { 
      "street":"", 
      "city":"Camarillo", 
      "state":"CA" 
     } 
     ], 
     "age":56, 
     "dob":"1958\/11\/01", 
     "yob":"1958", 
     "relatives":[ 
     { 
      "first_name":"SHARON", 
      "middle_name":"J", 
      "last_name":"Name", 
      "person_id":"001583349299" 
     }, 
     { 
      "first_name":"COREY", 
      "middle_name":"D", 
      "last_name":"Name", 
      "person_id":"036454253754" 
     }, 
     { 
      "first_name":"KATHLEEN", 
      "middle_name":"", 
      "last_name":"Name", 
      "person_id":"003096670145" 
     }, 
     { 
      "first_name":"KELSEY", 
      "middle_name":"MAYER", 
      "last_name":"Name", 
      "person_id":"080603146279" 
     } 
     ], 
     "middle_initial":"J.", 
     "gender":"m", 
     "f_phone_number":"N\/A", 
     "f_relatives":"Sharon Name 
Corey Name 
Kathleen Name 
Kelsey Name", 
     "a_relatives":"Sharon Name,Corey Name,Kathleen Name,Kelsey Name", 
     "f_priorAddresses":"Sacramento, CA;Las Cruces, NM;Big Bear Lake, CA;Camarillo, CA", 
     "street_name":"", 
     "street_number":"", 
     "report":"fENBfE5ld2J1cnkgUGFya3xNY21haG9ufEJyaWFufDAwMTU4MzEzMzM3MXw1NnwxOTU4LzExLzAxfHw5MTMyMHxTaGFyb24gTWMgTWFob24sQ29yZXkgTWNtYWhvbixLYXRobGVlbiBNY21haG9uLEtlbHNleSBNY21haG9ufFNhY3JhbWVudG8sIENBO0xhcyBDcnVjZXMsIE5NO0JpZyBCZWFyIExha2UsIENBO0NhbWFyaWxsbywgQ0E=" 
    }, 
    "1":{ 
     "person_id":"001683750301", 
     "source":"lexis", 
     "phone_number":"", 
     "first_name":"Brian", 
     "middle_name":"DANIEL", 
     "last_name":"Name", 
     "aliases":[ 
     { 
      "first_name":"B", 
      "middle_name":"", 
      "last_name":"Name" 
     }, 
     { 
      "first_name":"Brian", 
      "middle_name":"Daniel", 
      "last_name":"Name" 
     }, 
     { 
      "first_name":"Brian", 
      "middle_name":"Daniel", 
      "last_name":"Name" 
     }, 
     { 
      "first_name":"Brian", 
      "middle_name":"", 
      "last_name":"Name" 
     } 
     ], 
     "street":"", 
     "city":"Huntington Beach", 
     "state":"CA", 
     "zip":"92648", 
     "priorAddresses":[ 
     { 
      "street":"", 
      "city":"Huntington Beach", 
      "state":"CA" 
     }, 
     { 
      "street":"", 
      "city":"Santa Ana", 
      "state":"CA" 
     }, 
     { 
      "street":"", 
      "city":"Costa Mesa", 
      "state":"CA" 
     }, 
     { 
      "street":"", 
      "city":"Long Beach", 
      "state":"CA" 
     } 
     ], 
     "age":40, 
     "dob":"1974\/03\/24", 
     "yob":"1974", 
     "relatives":[ 
     { 
      "first_name":"ELAINE", 
      "middle_name":"D", 
      "last_name":"Name", 
      "person_id":"001684063727" 
     }, 
     { 
      "first_name":"THOMAS", 
      "middle_name":"W", 
      "last_name":"Name", 
      "person_id":"001684361956" 
     } 
     ], 
     "middle_initial":"D.", 
     "gender":"m", 
     "f_phone_number":"N\/A", 
     "f_relatives":"Elaine Name 
Thomas Name", 
     "a_relatives":"Elaine Name,Thomas Name", 
     "f_priorAddresses":"Huntington Beach, CA;Santa Ana, CA;Costa Mesa, CA;Long Beach, CA", 
     "street_name":"", 
     "street_number":"", 
     "report":"fENBfEh1bnRpbmd0b24gQmVhY2h8TWNtYWhvbnxCcmlhbnwwMDE2ODM3NTAzMDF8NDB8MTk3NC8wMy8yNHx8OTI2NDh8RWxhaW5lIE1jbWFob24sVGhvbWFzIE1jbWFob258SHVudGluZ3RvbiBCZWFjaCwgQ0E7U2FudGEgQW5hLCBDQTtDb3N0YSBNZXNhLCBDQTtMb25nIEJlYWNoLCBDQQ==" 
    } 
} 

JS: 

    var whereAt = []; 

     $.getJSON('/search/resultsJSON/CA/this/guy', function(json) { 
      whereAt.push(json); 
      console.log(whereAt); 
      for (var i = 0; i < whereAt.length; i++) { 
       console.log(whereAt[0][i].zip); 
       var test = whereAt[0][i].zip; 
        MQA.withModule('geocoder', function() { 
        map.geocodeAndAddLocations(test); 
       }); 
       } // end for loop 
      }); 

Я пытаюсь получить почтовое свойство для каждого объекта в массиве на что, пожалуйста, не возражает вещи MQA. Приведенный выше код работает, но только для получения свойства zip первого объекта в массиве. Я пытаюсь найти способ захватить их всех и console.log их на консоль. Любая помощь, которую я могу получить, очень ценится, и если я могу включить что-нибудь еще, чтобы помочь, я более чем счастлив предложить все, что могу. Еще раз спасибо за ваше время.

ответ

0

JSON уже является «объектом», нет необходимости вставлять его в массив. Эта структура JSON у вас больше похожа на словарь, чем на массив, где «0» и «1» являются ключами.

попробовать это:

var whereAt = json; 
for (var prop in whereAt) {  
    if(whereAt.hasOwnProperty(prop)){ 
    console.log(whereAt[prop].zip); 
    } 
} 

Кроме того, убедитесь, что вы удалите эти символы перевода строки в вашей собственности "f_relatives". JSON, который вы опубликовали, недействителен из-за них.

+0

Вот оно! Огромное спасибо. Я занимался этим в течение нескольких часов. Я подумал, что это то, что я переусердствовал. Еще раз спасибо. –

0

Я думаю, что вы имеете в виду:

var test = whereAt[0][i]["zip"]; 

JSON еще массив; у него просто есть пользовательские «ключи» HR для извлечения данных.

+0

Спасибо Я дал этому попытку, и это дает мне так же, как «var test = whereAt [0] [i] .zip;». Эта часть, в которую я могу вникать. Она находит способ получить zip для каждого объекта, где я runni в стену. –

+0

Я просто запустил ваш JSON через [** JSON Parser **] (http://json.parser.online.fr/), и он запущен в неожиданный токен. Вы уверены, что ваш JSON действителен? – David

+0

Кажется, на самом деле это нормально –

0

Да, вам нужна петля для всего, что является массивом в основном.

Например, предположим, что объект JSON вы предоставите в вашем примере называется jsonFile, и вы хотите пойти на все объекты в jsonFile["0"]["aliases"] массив, то вы сделали бы for цикл с условием, как (var i = 0; i < jsonFile["0"]["aliases"].length; i++).

Однако, если вы планируете больше работать с документами JSON, массивом и объектами, я бы настоятельно рекомендовал вам проверить библиотеку, например, lodash или альтернативу под названием underscore.

Они оба имеют кучу примеров, и первоначальные мало инвестиций времени в проверяя примеры и выяснить те, которые вам нужно будет вам сэкономить много неожиданных результаты и, в общем, время :)

У них есть функциональность для выполнения довольно сложных операций фильтрации/поиска/итерации по вышеупомянутым типам данных.

0

Если ваша цель состоит в том, чтобы рекурсивный взгляд через ключи объекта для определенного имущества, вероятно, вы должны использовать рекурсивную функцию следующим образом:

function findZipCodes(obj) { 
    if (typeof obj != 'object') 
     return; 
    if (typeof obj['zip'] != 'undefined') 
     zipCodes.push(obj['zip']); 
    for (prop in obj) { 
     findZipCodes(obj[prop]); 
    } 
    } 

Тогда код, чтобы получить JSON будет выглядеть следующим образом:

$(document).ready(function(){ 
    var zipCodes = []; 

    $.get('index.json', function(data){ 
    findZipCodes(data); 

    function findZipCodes(obj) { 
     if (typeof obj != 'object') 
     return; 
     if (typeof obj['zip'] != 'undefined') 
     zipCodes.push(obj['zip']); 
     for (prop in obj) { 
     findZipCodes(obj[prop]); 
     } 
    } 

    console.log(zipCodes); 
}); 

});

0

Ваша ошибка вызвана использованием цикла, основанного на индексе ("for (var i = 0; i < ..."), и это не будет работать для объектов со свойствами, как вы ожидаете. решения, но чтобы облегчить ваше замешательство о переборе на этом объекте, как массив, я рекомендую этот код:..

$.getJSON('/search/resultsJSON/CA/this/guy', function(json) { 
     keys = json.keys() 
     for (var i = 0; i < keys.length; i++) { 
      console.log(json[keys[i]].zip); 
      var test = json[keys[i]].zip; 
       MQA.withModule('geocoder', function() { 
       map.geocodeAndAddLocations(test); 
      }); 
      } // end for loop 
     }); 

Пожалуйста, см Object.keys() и For..in для справки

Смежные вопросы