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