在PHP中解码JSON的特定元素

时间:2014-09-10 19:10:09

标签: php json

我正在尝试解码JSON

我正在通过STOMP阅读JSON。有不同的JSON数据集,所以我需要弄清楚哪个JSON数据集已经通过。我通过阅读它的标题来做到这一点。

但是有一个特定的数据集我无法阅读

  foreach (json_decode($msg->body,true) as $event) {
    if(isset($event['schemaLocation'])) {
    $schedule_id=($event['schedule']['schedule_start_date']); 
    $signalling_id=($event['schedule']['schedule_segment']['signalling_id']);

    echo $schedule_id;
    }

在上面的示例中,isset函数工作正常,$ schedule_id也获得了正确的答案

但$ signalling_id会出现未定义索引

的错误

这是JSON的一部分转储(相当长的............)。带有signalling_id的JSON片段朝向JSON的末尾。任何有助于变量signalling_id的帮助都非常受欢迎。

    array(7) {
    ["schemaLocation"]=>
    string(72) "http://xml.networkrail.co.uk/ns/2008/Train itm_vstp_cif_messaging_v1.xsd"
    ["classification"]=>
    string(8) "industry"
    ["timestamp"]=>
    string(13) "1410374918000"
    ["owner"]=>
    string(12) "Network Rail"
    ["originMsgId"]=>
    string(47) "2014-09-10T18:48:38-00:00vstp.networkrail.co.uk"
    ["Sender"]=>
    array(3) {
      ["organisation"]=>
      string(12) "Network Rail"
      ["application"]=>
      string(4) "TOPS"
      ["component"]=>
      string(4) "VSTP"
    }
    ["schedule"]=>
    array(11) {
      ["schedule_id"]=>
      string(0) ""
      ["transaction_type"]=>
      string(6) "Create"
      ["schedule_start_date"]=>
      string(10) "2014-09-10"
      ["schedule_end_date"]=>
      string(10) "2014-09-10"
      ["schedule_days_runs"]=>
      string(7) "0010000"
      ["applicable_timetable"]=>
      string(1) "N"
      ["CIF_bank_holiday_running"]=>
      string(1) " "
      ["CIF_train_uid"]=>
      string(6) "W64017"
      ["train_status"]=>
      string(1) "1"
      ["CIF_stp_indicator"]=>
      string(1) "O"
      ["schedule_segment"]=>
      array(1) {
        [0]=>
        array(20) {
          ["signalling_id"]=>
          string(4) "5Y75"
          ["uic_code"]=>
          string(0) ""
          ["atoc_code"]=>
          string(0) ""
          ["CIF_train_category"]=>
          string(2) "EE"
          ["CIF_headcode"]=>
          string(0) ""
          ["CIF_course_indicator"]=
          ............................................ 

2 个答案:

答案 0 :(得分:1)

schedule_segment本身就是一个数组,所以不是

['schedule']['schedule_segment']['signalling_id']);

应该是

['schedule']['schedule_segment'][0]['signalling_id']);

答案 1 :(得分:1)

正如您在var转储中看到的,signalling_id位于另一个数组中。使用:

$signalling_id=($event ['schedule']['schedule_segment'][0]['signalling_id']);

如果一个具有键0的元素数组在整个过程中不是常数,则可能需要一些逻辑来确定每次迭代中的内容。