
本文介绍一种在 php 中手动构造类原始风格 json 字符串的方法:保持方括号独占行、每个对象独占一行、逗号后换行,适用于需人工可读又需程序处理的特殊场景。
在标准 JSON 处理流程中,json_encode() 默认输出紧凑单行格式(如 [{"id":"1","name":"john"},...]),而开发者有时需要保留类似手写 JSON 的“美观缩进”结构——即数组整体用 [ 和 ] 各占一行,每个对象独立成行,元素间以 , + 换行分隔。这种格式虽非标准 JSON 规范所要求,但在配置文件、调试输出或团队协作编辑场景中具有一定可读性优势。
PHP 原生不支持此类定制化格式输出(JSON_PRETTY_PRINT 会添加缩进空格,但无法实现“每对象一行+无缩进”的极简多行风格)。因此,需绕过 json_encode() 的数组整体编码逻辑,转为手动拼接:
// PHP < 8.1 兼容 polyfill
if (!function_exists('array_is_list')) {
function array_is_list(array $a): bool {
return $a === [] || (array_keys($a) === range(0, count($a) - 1));
}
}
function json_encode_oneline_per_item(array $data): string {
if (!array_is_list($data)) {
throw new InvalidArgumentException('Input must be a sequential list (indexed array)');
}
$encodedItems = array_map(fn($item) => json_encode($item, JSON_UNESCAPED_UNICODE), $data);
return "[\n" . implode(",\n", $encodedItems) . "\n]";
}使用示例:
$json_text = '
[
{"id": "1", "name": "john", "bd": []},
{"id": "2", "name": "gary", "bd": [1, 2]}
]';
$data = json_decode($json_text, true);
$data[1]['name'] = 'bill'; // 修改数据
echo json_encode_oneline_per_item($data);
// 输出:
// [
// {"id":"1","name":"john","bd":[]},
// {"id":"2","name":"bill","bd":[1,2]}
// ]⚠️ 重要注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 此方法不推荐用于生产环境的数据交换——它生成的是语义等价但格式非标准的 JSON 字符串,可能被严格解析器拒绝(尽管绝大多数 JSON 解析器接受换行和空格);
- json_encode() 默认已足够健壮,应优先使用 JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT 配合外部工具(如 jq '.' file.json 或 VS Code 插件)做可视化美化;
- 手动拼接跳过了 JSON 编码的安全校验(如循环引用检测、非法字符转义),务必确保输入数据结构干净;
- 若需保留原始字符串中的空格/注释(如 JSON5),PHP 原生不支持,应改用专用解析器。
总结:本文提供的函数是一种“折中方案”,仅适用于明确需要该格式且可控场景下的临时处理。真正可持续的实践是:用标准 JSON 存储与传输,用专业工具负责可读性呈现。











