首页 > 解决方案 > 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 ,那么显然该功能不起作用。

标签: phpjson

解决方案


如上所述,不建议将多个 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);
}

推荐阅读