我有这个样本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文件?
答案 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