在PHP开发中,处理JSON数据是常见操作,格式化JSON字符串能让数据展示更清晰,便于调试和查看。PHP提供了多个相关函数来完成JSON格式化工作,下面逐一介绍这些函数的用法。

json_encode函数
json_encode是PHP中最常用的将数组或对象转换为JSON字符串的函数,通过配置参数可以实现JSON字符串的格式化输出。其核心格式化参数是JSON_PRETTY_PRINT,开启后会在JSON字符串中添加换行和缩进,让结构更清晰。
除了JSON_PRETTY_PRINT,还可以搭配JSON_UNESCAPED_UNICODE参数,避免中文被转义为Unicode编码,让输出更易读。
<?php
// 定义测试数组
$data = [
'name' => '张三',
'age' => 25,
'hobby' => ['读书', '跑步', '编程']
];
// 普通转换,无格式化
$normalJson = json_encode($data);
echo "普通JSON字符串:\n";
echo $normalJson . "\n\n";
// 格式化输出,保留中文
$prettyJson = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "格式化JSON字符串:\n";
echo $prettyJson . "\n";
?>json_decode函数
json_decode函数的作用是将JSON字符串转换为PHP数组或对象,虽然它本身不直接格式化JSON字符串,但配合json_encode可以实现JSON字符串的重新格式化。比如当拿到一个压缩的JSON字符串时,可以先解码再编码并设置格式化参数,得到格式化的结果。
<?php
// 压缩的JSON字符串
$compressedJson = '{"name":"李四","age":30,"score":{"math":95,"english":88}}';
// 先解码为数组
$decodedData = json_decode($compressedJson, true);
// 再编码为格式化的JSON字符串
$formattedJson = json_encode($decodedData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "格式化后的JSON字符串:\n";
echo $formattedJson . "\n";
?>自定义格式化函数
如果需要对JSON格式化有更个性化的控制,比如自定义缩进字符、调整换行规则,可以自己编写格式化函数,通过解析JSON字符串的结构手动添加缩进和换行。
<?php
/**
* 自定义JSON格式化函数
* @param string $json 待格式化的JSON字符串
* @param string $indent 缩进字符,默认4个空格
* @return string 格式化后的JSON字符串
*/
function customFormatJson($json, $indent = ' ') {
$result = '';
$level = 0;
$inString = false;
$len = strlen($json);
for ($i = 0; $i < $len; $i++) {
$char = $json[$i];
// 处理字符串内部内容
if ($char === '"' && ($i === 0 || $json[$i-1] !== '\\')) {
$inString = !$inString;
}
// 非字符串内的结构符号处理
if (!$inString) {
if ($char === '{' || $char === '[') {
$result .= $char . "\n" . str_repeat($indent, $level + 1);
$level++;
continue;
} elseif ($char === '}' || $char === ']') {
$level--;
$result .= "\n" . str_repeat($indent, $level) . $char;
continue;
} elseif ($char === ',') {
$result .= $char . "\n" . str_repeat($indent, $level);
continue;
} elseif ($char === ':') {
$result .= ': ';
continue;
}
}
$result .= $char;
}
return $result;
}
// 测试自定义格式化函数
$testJson = '{"id":1,"info":{"title":"测试","count":10},"list":[1,2,3]}';
echo "自定义格式化结果:\n";
echo customFormatJson($testJson);
?>函数使用场景对比
不同格式化方式适合不同的使用场景,下面通过表格对比各方式的特点:
| 方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| json_encode+JSON_PRETTY_PRINT | 原生函数,使用简单,参数配置灵活 | 缩进和格式规则固定,无法深度自定义 | 常规JSON格式化需求,快速调试输出 |
| json_decode+json_encode组合 | 可以处理已有的压缩JSON字符串 | 需要两次编码解码,性能略有损耗 | 处理外部传入的未格式化JSON字符串 |
| 自定义格式化函数 | 可完全自定义格式规则,灵活度高 | 需要自己编写代码,可能存在边界情况bug | 有特殊格式化要求,原生函数无法满足的场景 |
注意事项
- 使用json_encode时要注意数据的编码,避免出现编码错误导致JSON生成失败,可以使用
JSON_UNESCAPED_UNICODE保证中文正常显示。 - json_decode的第二个参数设为true时返回数组,设为false时返回对象,根据实际需求选择。
- 自定义格式化函数需要处理JSON字符串中的转义字符,避免错误拆分结构。
通过上述几种方式,开发者可以根据实际需求选择合适的PHP函数来格式化JSON字符串,提升开发过程中的数据查看和调试效率。
json_encodejson_decodeJSON_PRETTY_PRINTJSON_UNESCAPED_UNICODEphp_json修改时间:2026-06-04 06:36:44