我正在尝试遍历一些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_sequences。
以下是您编辑或处理的代码的交互式链接: http://sandbox.onlinephpfunctions.com/code/f21ca8928da7de3e9fb351edb075d0a446906937
答案 0 :(得分:2)
如果您编写自己的解析器或使用带回调的流解析器,您可能会获得更好的结果。这是一个PHP implementation这样的解析器,可用于回调。因此,不是将整个JSON数据读入内存,解析器将以块的形式读取数据,并在新对象启动或读入属性时通知您的“侦听器类”。通过这样做,您应该获得单独的回调事件对于每个stop_time_update
属性而不是解析数组中的一个值。
非常类似于SAX对于XML。
答案 1 :(得分:1)
你应该重写你的JSON - 你有多个具有相同名称的键,尝试print_r($result)
看看我在说什么 - PHP会一次又一次地覆盖“stop_time_update”键,你将能够仅访问最后一个条目。相反,你应该像这样组织你的JSON:
[
{
"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_sequence" :71,
"departure" : {
"delay" : 240,
"time" : 1380215075
},
"stop_id" : "6095"
}]
}
}]
然后您将能够像这样迭代您的数据:
foreach($result[0]->trip_update->stop_time_update as $update)
{
$time = $update->departure->time;
...
}
如果你不能改变数据结构,那么可能对你有帮助的是一个PULL解析器 - 一个不返回解析数据结构的解析器,但允许你使用数据流 - 这样你就可以迭代每个节点。我设法找到的唯一一个是PHP的扩展:
https://github.com/shevron/ext-jsonreader
检查使用部分。
答案 2 :(得分:1)
此JSON
响应无效,因为它包含重复的密钥,但JSON
没有allow duplicate keys
。
您应该联系您尝试从此处回复此服务的服务。
如果您有一个有效的JSON
响应,那么您可以使用返回对象或数组的json_decode
函数对其进行解码(取决于第二个参数);
你不能使用JSON parser
,因为它会因为相同的键而覆盖第一个元素。唯一合适的解决方案是询问是谁创建了“JSON”来修复他的代码,要么使用数组,要么使用具有唯一键的对象。
另一种选择是编写自己的解码器函数来解析它
答案 3 :(得分:1)
您好,也许您可以更改名称。
function next_update($coincidencias){
$replace=$coincidencias[0].$GLOBALS["json_stop_time_update"]++;
return $replace;
}
$result= preg_replace_callback("/stop_time_update/","next_update",$jsondata);
$result = json_decode($result);