使用php修改JSON Feed

时间:2017-09-15 16:06:03

标签: php json

我有一个由api访问的JSON Feed。 它返回的json feed如下:

[  
   {  
      "isoDate":"2017-09-15T00:00:00.0000000",
      "events":[  
         {  
            "id":"-7317",
            "name":"Exhibition SKMU: The collection 2015-2017",
         },
         {  
            "id":"-91417",
            "name":"Torget - a multi cultural meeting place in Geilo",
         }
      ]
   },
   {  
      "isoDate":"2017-09-16T00:00:00.0000000",
      "events":[  
         {  
            "id":"-7317",
            "name":"Exhibition SKMU: The collection 2015-2017",
         },
         {  
            "id":"-91417",
            "name":"Torget - a multi cultural meeting place in Geilo",
         }
      ]
   }
]

我需要在每个事件中列出isoDate而不是单独列出。 例如

[  
   {  
      "events":[  
         {  
            "isoDate":"2017-09-15T00:00:00.0000000",
            "id":"-7317",
            "name":"Exhibition SKMU: The collection 2015-2017",
         },
         {  
            "isoDate":"2017-09-15T00:00:00.0000000",
            "id":"-91417",
            "name":"Torget - a multi cultural meeting place in Geilo",
         }
      ]
   },
   {  
      "events":[  
         {  
            "isoDate":"2017-09-16T00:00:00.0000000",
            "id":"-7317",
            "name":"Exhibition SKMU: The collection 2015-2017",
         },
         {  
            "isoDate":"2017-09-16T00:00:00.0000000",
            "id":"-91417",
            "name":"Torget - a multi cultural meeting place in Geilo",
         }
      ]
   }
]

这可以通过php实现吗?基本上从网址获取该Feed,然后以我首选的格式显示它?

3 个答案:

答案 0 :(得分:4)

所以这就是你需要做的,回到你想要的json格式, $json是你的json字符串:

$eventList = json_decode($json);

foreach($eventList as $eventEntry){
    $isoDate = $eventEntry->isoDate;

    foreach($eventEntry->events as $subEventEntry){
        $subEventEntry->isoDate = $isoDate;
    }

    //delete the isoDate from outer
    unset($eventEntry->isoDate);
}

echo json_encode($eventList);

所以基本上,你首先将你的json解码为php结构,应用你的更改然后再编码。请注意,我没有将true作为$json_decode的第二个参数,而是使用生成的对象。

:您的json不是标准的comform,可能会导致错误。 PHP将正确解码它,因为您的对象以逗号结尾。对象的最后一个元素应该没有逗号。而不是

{  
    "id":"-91417",
    "name":"Torget - a multi cultural meeting place in Geilo",
}

像这样:

{  
    "id":"-91417",
    "name":"Torget - a multi cultural meeting place in Geilo"
}

我知道,当你从API获取它时,这可能是一个问题,但这本身就是另一个问题......

修改

获得每个"事件"在一个大阵列中,你必须像你的想象一样存储它们;)。这样想:$subEventEntry拥有一个"事件" -object。因为您正在迭代这两个级别,所以您会看到每个级别的对象。我的建议是将它们存储在一个新的数组中,并重新构建它周围的结构:

$everything = new stdClass();
$everything->events = array();

然后,在内循环中:

foreach($eventList as $eventEntry){
    $isoDate = $eventEntry->isoDate;

    foreach($eventEntry->events as $subEventEntry){
        $subEventEntry->isoDate = $isoDate;
        $everything->events[] = $subEventEntry; // <-- this has to be added
    }

    //delete the isoDate from outer
    unset($eventEntry->isoDate);
}

重新构建结构时,您不再需要旧结构,可以删除unset

记住json中的每个[ ]对代表一个数组,每个{ }对都是一个对象(stdClass)。该对象/数组的名称由superobject中的类属性引用->

答案 1 :(得分:1)

是的,您可以使用json_decode()功能,例如:

 $yourjson;/* your json */
 $events = json_decode($yourjson, true);
 foreach($events as $event){

 echo $event["isoDate"];
 }

答案 2 :(得分:-2)

您可以使用json_decode将json对象解码为php数组,然后使用json_encode修改数组并对其进行编码