【问题标题】:Symfony2 Json parse with datesSymfony2 Json 解析日期
【发布时间】:2016-12-01 19:14:09
【问题描述】:

拥有这个 JSON:

在线查看: http://www.jsoneditoronline.org/?id=97bbcb19871e89ff0702f8547589a688

试图解析出来,但有些字段名称是日期,所以我不知道该怎么做。

我想解析并存储在DB中(持久化在MongoDB中):

  • 日期
  • 参考 (neo_reference_id)
  • 姓名
  • 速度(公里/小时)
  • 是危险的 (is_potentially_hazardous_asteroid)

试图这样做,所以我可以获得参考,名称,速度并且很危险:

  $data = json_decode($response->getBody(), true);

  foreach($data['near_earth_objects'] as $neos)
  {
    foreach($neos as $item)
    {
      $output->write($item['name']);
    }
  }

如何获取对应的日期字段?

在 Symfony2 中解析 JSON 数据的最佳实践是什么?

谢谢,

更新 1:

Tried as Half Crazed 已回答:

$jd = new JsonDecode();
$neo_obj = $jd->decode($response->getBody(),"json");
foreach($neo_obj->near_earth_objects as $date => $object) {
  // store $date here
  $output->write($date);
  foreach($date as $objects) {
  $links = $objects['links'];
  $neo_ref_id = $objects['neo_reference_id'];
  $output->write($links);
  $output->write($neo_ref_id);
  }
} 

$date 在那里,但在第二次查看时它会发出警告并且没有显示任何内容。

  [Symfony\Component\Debug\Exception\ContextErrorException]  
  Warning: Invalid argument supplied for foreach()  

有什么建议吗?

谢谢,

更新 2:

这样就可以了。

可以改进它以获得更好的性能和代码可读性:) 吗?

        $jd = new JsonDecode();
        $neo_obj = $jd->decode($response->getBody(),"json");
        foreach($neo_obj->near_earth_objects as $date => $object) {
          $output->writeln("date:".$date);
          foreach($neo_obj->near_earth_objects as $object1) {
            foreach($object1 as $object2)
            {
              $output->writeln("name:".$object2->name);

              $output->writeln("neo_reference_id:".$object2->neo_reference_id);
              $output->writeln("is_potentially_hazardous_asteroid:".$object2->is_potentially_hazardous_asteroid);
              foreach($object2->close_approach_data as $object3)
              {
                $i=0;
                foreach($object3->relative_velocity as $object4)
                {
                  if($i===1)
                  {
                    $output->writeln("speed:".$object4);
                  }
                  $i=$i+1;
                }
              }


            }
          }
        }

【问题讨论】:

    标签: php json symfony


    【解决方案1】:

    您可以使用this进行解码(检查它是否可解码,然后解码)

    在我看来,存储这些的最好方法是遍历$obj->near_earth_objects。对于(粗略的)示例:

    foreach($obj->near_earth_objects as $date => $object) {
      // store $date here
      foreach($date as $objects) {
        $links = $objects['links'];
        $neo_ref_id = $objects['neo_reference_id'];
        // etc..
    
        // store in db
      }
    }
    

    【讨论】:

    • 感谢@Half Crazed !!!我根据您的建议使用 Update 1 更新了问题。不幸的是,第二个循环有问题。有什么想法吗?
    • 想通了。您能看到我的更新 2 并提出改进建议吗?
    • @android_dev 你不需要foreach($neo_obj->near_earth_objects as [...]) { 两次。您可以删除该内部 foreach 并仍然循环遍历 $object$object 将是 near_earth_objects[date] 数组中的所有内容。当您不确定是否应该访问数组项或对象属性时,您应该随时var_dump($var),例如$array['key']$obj->prop
    【解决方案2】:

    你可以试试这个看看是否有效:

    foreach($neos as $item){
        for($i=0; $i<sizeof($item); $i++){
            $output->write( $item['$i'] );
        }
    }
    

    不确定,但我认为它可能会起作用。这将获取 Date 元素中的每个子元素,这是您想要的正确吗?如果没有,请更新您的帖子。

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      相关资源
      最近更新 更多