PHP格式的json文件(在Pretty_Print和Compact一行之间替换)

时间:2019-01-21 18:21:07

标签: php json

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,则该功能显然无法正常工作。

1 个答案:

答案 0 :(得分:0)

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