2014-12-30 2 views
0

Извините, если это было покрыто, но я посмотрел и не могу найти ответ, который работает.Декодирование вложенных JSON в PHP

У меня есть следующие JSON (укороченный для ясности):

[{ 
    "header": { 
     "msg_type": "0001" 
    }, 
    "body": { 
     "event_type": "ARRIVAL", 
     "train_id": "384T22MJ20" 
    } 
},{ 
    "header": { 
     "msg_type": "0003" 
    }, 
    "body": { 
     "event_type": "DEPARTURE", 
     "train_id": "382W22MJ19" 
    } 
}] 

Теперь я знаю, что могу использовать json_decode, чтобы создать массив PHP, но не зная много о PHP я не знаю, как получить его делать то, что я хочу. Мне нужно иметь доступ к значению из каждого массива. Например, мне нужно будет извлечь train_id из каждого массива. На данный момент у меня есть это:

$file = "sampleData.json"; 
$source = file_get_contents($file); 
$data = json_decode($source); 

$msgbdy = $data->body; 
foreach($msgbdy as $body){ 
    $trainID = $body->train_id; 
} 

Я знаю, что это неправильно, но я не уверен, если я нахожусь на правильном пути или нет.

Заранее спасибо.

+0

Спасибо всем, воспользовавшись комбинацией ответов для достижения того, что мне нужно. Пока не могу проголосовать. – sjmaceyful

ответ

1

Я предлагаю передать его true в качестве параметра, проще работать с ассоциативными массивами, чем объекты:

$messages = json_decode($source, true); 
foreach($messages as $message){ 
    $trainID = $message["body"]["train_id"]; 
} 
+0

@specializt и meda всегда используют isset или empty. Мне нравится использование json_decode для массива. – OIS

0

Вы обрабатываете его не в том порядке: ваша строка array объектов. Не объект с массивами.

Прежде всего вам нужен большой цикл foreach для итерации по массиву, а затем доступ для каждого элемента к «телу» и «train_id».

Ваш код должен, таким образом, следующим образом:

foreach($data as $item) { 
    echo $item->body->train_id; //or do something else with $item->body->train_id 
} 
0

Может быть что-то вроде:

$data = json_decode($source); 

foreach ($data as $message) { 
    $trainId = $message->body->train_id; 
    // Not sure what you want to do wit this^
} 

Вы должны цикла по каждой всей записи. Посмотрите, как повторяются данные, и это то, что вам нужно перебрать.

0

Ваша попытка доступа к массиву как к объекту. Нотация массива будет $data[0]['body'], чтобы получить значение для «тела» в первой записи в массиве.

2

анонимные объекты десериализации, как массив элементов, foreach может справиться с этим:

$objs = json_decode($source) 
foreach($objs as $obj) 
{ 
    $body = $obj->body; //this is another object! 
    $header = $obj->header; //yet another object! 
} 

и в этом цикле, теперь вы можете получить доступ к msg_type, train_id и event_type через $body и $header