在PHP中解码嵌套的JSON

时间:2014-12-30 23:04:34

标签: php arrays json

打扰一下,如果已经涵盖了这一点,但我看了,找不到有效的答案。

我有以下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;
}

我知道这是错的,但我不确定我是否走在正确的轨道上。

提前致谢。

5 个答案:

答案 0 :(得分:2)

匿名对象被反序列化为数组成员,foreach可以处理:

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

在该循环中,您现在可以通过msg_typetrain_id

访问event_type$body$header

答案 1 :(得分:1)

我建议将true作为参数传递,使用关联数组比使用对象更容易:

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

答案 2 :(得分:0)

您以错误的顺序处理它:您的字符串是对象的数组。不是数组的对象。

首先需要使用大型foreach循环迭代数组,然后访问每个元素" body"和" train_id"。

您的代码应如下:

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

答案 3 :(得分:0)

可能是这样的:

$data = json_decode($source);

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

您需要循环遍历每个条目。了解数据的重复位置,以及循环所需的内容。

答案 4 :(得分:0)

您尝试像对象一样访问数组。数组表示法将$data[0]['body']来检索" body"的值。键入数组中的第一个条目。