如何解析fgets和file_get_content在php中读取的Json文件?

时间:2018-09-16 17:12:24

标签: php json decode fgets

我有这个样本JSON文件:

{
"users":[
{"username":"user123","password":"123321abc"},
{"username":"user124","password":"123321abc"},
{"username":"user125","password":"123321abc"}
]
}

我像那样设置它,因为我需要使用fgets在php中读取它。像这样:

<?php
$newUser = ["username"=>"user123","password"=>"123321abc"];
$jsonFile = fopen("JSONsample.json","r+");
while(($line = fgets($jsonFile) != false){
$oldUser = json_decode($line,true);
if($oldUser["username"] === newUser["username"]){
if($newUser["password"] === oldUSer["password"]){
doSomething($newUser);
}
}
?>

问题是,当fgets读取不是完整json对象的行时,它将返回null。因此,由于该行末尾的逗号,它将前两个用户对象读取为null。我可以删除逗号,它会在需要时返回用户。但这并不是一个有效的JSON整体。我需要其他功能的“用户”数组。

所以,我的问题是,有什么方法可以安排我的JSON,以便当整体使用时以及逐行读取时,它是有效的JSON文件?

3 个答案:

答案 0 :(得分:0)

在您的情况下,请确保每行以大括号“ {”开头,以大括号“}”结尾。然后,您可以假定它是有效的JSON,然后应用json_decode

function startsWith($haystack, $needle)
{
   $length = strlen($needle);
   return (substr($haystack, 0, $length) === $needle);
}

function endsWith($haystack, $needle)
{
   $length = strlen($needle);
   if ($length == 0) {
       return true;
   }

   return (substr($haystack, -$length) === $needle);
}

$newUser = ["username"=>"user123","password"=>"123321abc"];
$jsonFile = fopen("JSONsample.json","r+");
while(($line = fgets($jsonFile) != false){
   $line = trim($line);
   if(!startswith($line,"{") || !endswith($line,"}")) continue;

   $oldUser = json_decode($line,true);
   if($oldUser["username"] === newUser["username"] && $newUser["password"] === oldUSer["password"]){
         doSomething($newUser);
   }
}

答案 1 :(得分:0)

$json_file_data = json_decode(file_get_contents('JSONsample.json'), true);
$users_info = $json_file_data.users;
$newUser = $users_info[0];
$oldUser = $users_info[1];

我想您可以从这里轻松获取数据,无论如何请告诉我。

答案 2 :(得分:0)

那里有composer软件包,它通过解析文件流而不是全部将其读入内存来解决内存问题,例如该软件包 salsify/json-streaming-parser

在Packagist: https://packagist.org/packages/salsify/json-streaming-parser

在GitHub上: https://github.com/salsify/jsonstreamingparser