php - PHP 格式 json 文件(Pretty_Print 和 Compact 一行之间交替)
问题描述
json_decode 有一个“美化” json 文件的选项;
$json = json_encode($file,JSON_PRETTY_PRINT)
这:
{"name":"John","age":30,"city":"New York"}
{"name":"Mary","age":20,"city":"New York"}
变成这样:
{
"name":"John",
"age":30,
"city":"New York"
}
{
"name":"Mary",
"age":20,
"city":"New York"
}
有没有办法倒回一条线?
我有一个循环遍历文件的函数,其中每一行都是一个对象。因此,如果文件有 pretty_print ,那么显然该功能不起作用。
解决方案
如上所述,不建议将多个 JSON 对象放在一个文件中。但是,出于某种原因,如果您需要这样做;你有像我这样的问题,这是解决方案。
如上所述,json_decode()
确实将美化的 json 格式化回一行;但是,具有多个 json 对象的文件不是有效文件。因此,您无法获得全部内容并通过json_decode()
. 即使你可以,你也会有一个包含多个对象的单行,这只会转移问题。
我找到了这个功能,它完美地工作:
function json_split_objects($json)
{
$q = FALSE;
$len = strlen($json);
for($l=$c=$i=0;$i<$len;$i++)
{
$json[$i] == '"' && ($i>0?$json[$i-1]:'') != '\\' && $q = !$q;
if(!$q && in_array($json[$i], array(" ", "\r", "\n", "\t"))){continue;}
in_array($json[$i], array('{', '[')) && !$q && $l++;
in_array($json[$i], array('}', ']')) && !$q && $l--;
(isset($objects[$c]) && $objects[$c] .= $json[$i]) || $objects[$c] = $json[$i];
$c += ($l == 0);
}
return $objects;
}
就像这样使用它:
$array = json_split_objects($json);
foreach($array as $arr){
file_put_contents('file.json', $arr . "\n", FILE_APPEND);
}
推荐阅读
- mysql - 如何在 Azure Web 应用装载存储中指定带点的装载路径
- php - 我如何配置 XAMPP 以便它在 html 文档中执行?
- java - 无法解析方法 .getFilter()
- reactjs - NextJS/Typescript/Apollo 错误;类型上不存在属性
- javascript - Laravel Eloquent 使用 Ajax 进行多对多搜索
- sql - 如何选择一列以使今天的总数显示为昨天
- regex - Removing long tab-like white space in between strings in Perl
- amazon-rds - AWS RDS SQL Server 上的 Azure Devops 服务器
- javascript - API -> 为 getAll 创建可重用函数
- javascript - Vuejs组件虽然注册但未呈现