【发布时间】:2013-10-02 23:01:33
【问题描述】:
我正在尝试遍历一些 JSON 数据并提取特定值。这是 JSON 数据和部分工作的代码。
$jsondata = '
[
{
"id" : "421356",
"trip_update" : {
"trip" : {
"trip_id" : "421356",
"start_time" : "12:05:00",
"start_date" : "20130926",
"route_id" : "15"
},
"stop_time_update" : {
"stop_sequence" :70,
"departure" : {
"delay" : 240,
"time" : 1380215057
},
"stop_id" : "6090"
},
"stop_time_update" : {
"stop_sequence" :71,
"departure" : {
"delay" : 240,
"time" : 1380215075
},
"stop_id" : "6095"
}
}
}]';
$result = json_decode($jsondata);
foreach($result as $value) {
echo "trip_id: ".$value->trip_update->trip->trip_id;
if (gettype($value->trip_update ) == "object") {
foreach($value->trip_update as $item) {
echo " - stop_sequence: ".$item->stop_sequence;
}
}
}
我可以得到'trip_update->trip'下的第一级数据。但在“trip_update”中也可以有任意数量的“stop_time_update”数据。由于此数据与 trip_update 数据相关,因此我需要遍历它并关联它。
最终目标是将此数据保存到数据库(代码中未显示),因此为清楚起见,这将是我想在此示例中保存的简化的 2 行数据库数据:
trip_id,stop_sequence
421356,70
421356,71
源数据中可以有任意数量的 stop_sequence。
这里是代码的交互式链接,供您编辑或弄乱: http://sandbox.onlinephpfunctions.com/code/f21ca8928da7de3e9fb351edb075d0a446906937
【问题讨论】:
-
尝试JSONlint,虽然它是有效的JSON,但
stop_time_update的第二次出现被删除(或者更确切地说,如果被第二次覆盖,则第一次出现),它是对象属性并且不能被定义两次。它应该是一个包含两个对象的数组 -
谢谢,它验证了。
-
我知道它是有效的,正如我在评论中提到的那样。关键是,它的结构很糟糕,你应该向这个 JSON 的提供者提及它。
-
它可能会验证,但您没有围绕重复元素的正确数组结构
[]。因此,您在json_decode()步骤上丢失了数据。