2016-12-01 107 views
0

有此JSON:Symfony2的Json的解析与日期

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

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

我想分析并存储在数据库(MongoDB中仍然存在):

  • 日期
  • 引用(neo_reference_id)
  • 速度(kilometers_per_hour)
  • 是危险的(is_potentially_hazardous_asteroid )

试着d所以我可以获得参考,名称,速度和危险性:

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

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

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

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

感谢,

更新1:

尝试作为半疯狂已经回答了:

$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); 
    } 
} 

$日期是存在的,但在第二次看它做出警告,并没有得到显示。

[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; 
       } 
       } 


      } 
      } 
     } 

回答

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 
    } 
} 
+0

Thanks @Half Crazed !!!根据您的建议,我更新了Update 1的问题。不幸的是,第二个循环存在问题。有任何想法吗? –

+0

想通了。你能看到我的更新2,也许建议改进? –

+0

@android_dev你不需要做foreach($ neo_obj-> near_earth_objects as [...]){'两次。您可以删除内部的'foreach',而是仍然在'$ object'上循环。 '$ object'将成为'near_earth_objects [date]'数组中的所有内容。如果你不确定是否应该访问一个数组项或对象属性,例如'$ array ['key']'vs'$ obj-> prop',那么你应该随时'var_dump($ var) –

0

你可以试试这个,看看是否能工作:

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

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