2015-01-13 2 views
-2

Я передаю json закодированную строку в ответе ajax на мой Javascript. Когда я console.log в JSON, после JSON.parse, он выглядит следующим образом:Parse JSON в Javascript от PHP

[ 
{"732": 
    { 
     "doctor_name":"First M. Last ", 
     "degree":"MD" 
    } 
}, 
{"377": 
    { 
     "doctor_name":"First M. Last ", 
     "degree":"MD" 
    } 
}, 
{"1092": 
    { 
     "doctor_name":"First M. Last", 
     "degree":"DO" 
    } 
}, 
{"759": 
    { 
     "doctor_name":"First M. Last", 
     "degree":"MD" 
    } 
    }, 
    {"1628": 
    { 
     "doctor_name":"First M. Last", 
     "degree":"DO" 
    } 
    } 
] 

Мне нужно получить доступ к каждому из этих объектов, не зная идентификаторы (в данном случае «732», «377» , "1092", "759" и т. Д.)

Не уверен, что мои данные даже структурированы правильно, но я даже не могу использовать Object.keys (obj), поскольку он возвращает ошибку свойства не объекта.

Путь, я структурировать мой PHP массив выглядит следующим образом:

foreach ($doctors as $group){ 
    $doctor_results[][(int)$group->prac_id]=array(
     'doctor_name' => (string)$group->name, 
     'degree' => (string)$group->degree, 
    ); 
    } // end foreach 

Я хочу, чтобы каждый идентификатор массива для использования в качестве ключа, не уверен, если это имеет много смысла. TYIA

+0

Совет. Ваш JSON - это массив, а не объект. – Marty

+0

Выглядит так, как будто ваши данные не обрабатываются. Покажите свой код, который выполняет синтаксический анализ. –

+1

Но, кроме того, я думаю, что ваша структура объектов будет улучшена, если вы переместили идентификаторы во внутренний объект под ключом «id», так что у вас просто есть простой массив объектов. –

ответ

0

Вы, скорее всего, хотите ваш PHP выглядеть следующим образом:

foreach ($doctors as $group){ 
    $doctor_results[(int)$group->prac_id]=array(
     'doctor_name' => (string)$group->name, 
     'degree' => (string)$group->degree, 
    ); 
    } // end foreach 

Примечания недостающего [], что подразумевало бы толкая элемент на Numeri c массив. Второй набор скобок в вашем примере предлагает PHP, что созданный числовой элемент должен быть ассоциативным массивом с элементом с «prac_id» в качестве ключа. PHP автоматически создает этот ассоциативный массив, создавая структуру с ключом, вложенным на один уровень дальше, чем вы хотите, чтобы иметь возможность захватить элемент «prac_id» простым доступом к ключам в JavaScript. Как и вам, вам понадобится вложенный цикл, как в ответе Даррена.

0

Я сильно согласен с комментариями вывешенного Marty и Six облапанной Man, но если вы хотите, чтобы петли через JSON, это будет работать:

jQuery.each(obj, function(index, data){ 
    jQuery.each(data, function(id, fields){ 
     console.log(id); // returns the ID's of the objects: 732, 377,....etc 
     console.log(fields); // returns the fields for each object. (doctor_name & degree) 
    }); 
}); 

JSFiddle Demo

0
[ 
{prac_id:"732",data: 
    { 
     "doctor_name":"First M. Last ", 
     "degree":"MD" 
    } 
},...] 

foreach ($doctors as $group){ 
$doctor_results[][(int)$group->{'prac_id'}]=array(
    'doctor_name' => (string)$group->{'data'}->{'name'}, 
    'degree' => (string)$group->{'data'}->{'degree'}, 
); 

} // конец Еогеасп

0

Ваш Аякса ответ массив ОБЪЕКТА. Если вы закодируете его на json_encode ($ array), ваш ответ ajax в порядке. Вы можете проверить свой ответ ajax здесь: http://json.parser.online.fr/

Итак, я думаю, вы можете изменить свой вызов ajax. Вы можете просто добавить этот dataType: 'json' в ваш ajax. Он автоматически обработает ваш ответ JSON.

$.ajax({            
    url: 'your_ajax_url',       
    data: 'data',               
    dataType: 'json',     
    success: function(data)   
    { 
    $.each(data, function(index, obj){ 
     $.each(obj, function(id, nested_obj){ 
     console.log("ID: "+id); 
     console.log("doctor name: "+nested_obj['doctor_name']+",degree:"+ nested_obj['degree'] ); 
     }); 
    }); 
    } 
)}