Json解码PHP中的麻烦(多个数组)

时间:2014-10-28 20:38:03

标签: arrays json

以下是通过webhook存储在我的服务器上的Json文件:

  

[{"事件":"开""电子邮件":" myemail@email.com","&时间戳#34;:1414435811,"类别":["通讯&#34],"通讯" {" newsletter_user_list_id":" 18177422& #34;" newsletter_id":" 3318683"" newsletter_send_id":" 3470425"}}]   [{"事件":"开""电子邮件":" youremail@email.com","时间戳" :1414435811"类别":["通讯&#34],"通讯" {" newsletter_user_list_id":" 18177422" " newsletter_id":" 3318683"" newsletter_send_id":" 3470425"}}]

我想阅读此文件并将其更新到我的数据库中。我试图将网络上的片段放在一起,但它并没有真正起作用......我(我想)我很难弄清楚如何读取多个数组。

  

[{"事件":"开""电子邮件":" myemail@email.com","&时间戳#34;:1414435811,"类别":["通讯&#34],"通讯" {" newsletter_user_list_id":" 18177422& #34;" newsletter_id":" 3318683"" newsletter_send_id":" 3470425"}]

要使用上面给出的示例,当webhook.log文件只填充了Json文件的第一部分时,它可以正常工作并输出:open myemail @ email 10/27/2014 01:50:11。当我尝试读取多个数组时,它会给我:未捕获的异常' InvalidArgumentException' with message' Passed变量不是数组或对象,而是使用空数组。'由于$ json在提示时输出整个文件,我假设" json_decode($ json,TRUE)"没有做好自己的工作。我是新手,需要一些帮助......谢谢!

 $filename = "webhook.log";
 $handle = fopen($filename, "r");
 $contents = fread($handle, filesize($filename));

 $json = file_get_contents($filename);
 fclose($handle);


 $jsonIterator = new RecursiveIteratorIterator(
     new RecursiveArrayIterator(json_decode($json, TRUE)),
     RecursiveIteratorIterator::SELF_FIRST);

 foreach ($jsonIterator as $key => $val) {
     if(is_array($val)) {
        // echo "$key:\n";
     } 
     else {
           if ($key!=Newsletter){
           // echo "$key => $val\n";
               if ($key==event){
                   $status=$val;
                   echo $status;
               }
               if ($key==email){
                   $email=$val;
                   echo $email;
               }
               if ($key==timestamp){
                   $date=date('m/d/Y h:i:s', $val);
                   echo $date;
               }
          }
     }
 }

1 个答案:

答案 0 :(得分:0)

您提供的文件作为示例不是有效的JSON字符串。这是一种艰难的停留。

您可以确认JSON字符串here的无效性:

Parse error on line 15:
...5"        }    }][    {        "eve
--------------------^
Expecting 'EOF', '}', ',', ']'

具体而言,指出的是阵列的对接:

[... array data ...]
[... another array ...]

这是不正确的语法。可以解码多个JSON数组,但它们必须位于父容器中,并且它们之间有一个有效的分隔符:

[
    [... array data ...],
    [... another array ...]
]

其中[ ... ]是父数组,,将它们分开。这将为您提供一系列数组。

不幸的是,没有办法解析JSON字符串以使你拥有的行为正确。 Regex不是这里的解决方案,好吧,不是简单的正则表达式。看看你是否能以正确的形式获取数据。或者,如果您从两个不同的地方/电话中获取数据,并且首先将其写入文件,请以正确的形式写入。

如果你想要一个充满JSON数组的文件,你想要逐步写入并作为数组数组读出,请尝试按照这里的方式编写它们,但用,分隔它们。当你读出它们时,只需用[ ... ]包裹它们并解码即可。这应该会给你预期的结果:

将一个写入空文件:

[... json array 1 ...]

写另一个(在现有文件的末尾添加一个昏迷并附加JSON):

[... json array 1 ...],
[... json array 2 ...]

将其完全读入PHP字符串,包含在[ ... ]

$file_string = $...; // the above
$json_string = "[$file_string]"; // now valid
// decode

那应该为你做。