在PHP开发中,处理JSON嵌套结构是数据交互场景下的常见需求,尤其是对接第三方接口、存储复杂配置数据时,经常需要将多层嵌套的数组或对象转换为格式清晰、可读性强的JSON字符串。

基础格式化方法
PHP内置的json_encode函数是处理JSON格式化的核心工具,针对嵌套结构,最常用的参数是JSON_PRETTY_PRINT,它可以让输出的JSON自动换行缩进,清晰展示嵌套层级。
下面是一个简单的嵌套数组格式化示例:
<?php
// 定义多层嵌套的数组结构
$nestedData = [
'user_info' => [
'name' => '张三',
'age' => 25,
'hobbies' => ['阅读', '编程', '跑步']
],
'order_list' => [
[
'order_id' => 1001,
'price' => 99.9,
'status' => '已支付'
],
[
'order_id' => 1002,
'price' => 199.5,
'status' => '待发货'
]
]
];
// 使用JSON_PRETTY_PRINT格式化嵌套结构
$formattedJson = json_encode($nestedData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $formattedJson;
?>上述代码中JSON_UNESCAPED_UNICODE参数可以避免中文被转义为Unicode编码,保证输出内容的可读性,两个参数通过按位或符号组合使用,同时生效。
对象嵌套的格式化处理
如果嵌套结构中包含对象,需要注意json_encode默认只会序列化对象的公有属性,私有和受保护属性需要额外处理。可以通过给类实现JsonSerializable接口来自定义序列化逻辑。
<?php
class UserInfo implements JsonSerializable {
private $name;
private $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
// 自定义JSON序列化逻辑
public function jsonSerialize() {
return [
'name' => $this->name,
'age' => $this->age
];
}
}
// 定义包含对象的嵌套结构
$data = [
'user' => new UserInfo('李四', 30),
'extra' => [
'vip_level' => 2,
'expire_time' => '2024-12-31'
]
];
$result = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo $result;
?>常见注意事项
- 如果嵌套结构中存在循环引用,
json_encode会返回false,需要先处理循环引用问题,比如提前提取需要序列化的字段。 - 处理超大嵌套结构时,要注意内存占用,避免一次性加载过多数据导致内存溢出。
- 如果需要将格式化后的JSON转回嵌套结构,使用
json_decode函数时第二个参数传true,可将JSON对象转为关联数组,方便后续操作。
下面是json_decode的使用示例:
<?php
$jsonStr = '{
"user_info": {
"name": "张三",
"age": 25
}
}';
// 第二个参数为true,返回关联数组
$arrayData = json_decode($jsonStr, true);
echo $arrayData['user_info']['name']; // 输出 张三
?>参数组合参考
不同场景下可以组合使用json_encode的参数,以下是常用参数说明:
| 参数 | 作用 |
|---|---|
| JSON_PRETTY_PRINT | 格式化输出,自动添加缩进和换行,展示嵌套层级 |
| JSON_UNESCAPED_UNICODE | 不转义中文和多字节字符,保持原始内容 |
| JSON_UNESCAPED_SLASHES | 不转义斜杠,避免URL等字段被额外转义 |
| JSON_NUMERIC_CHECK | 将数字字符串转为数字类型,适合处理数值类嵌套字段 |
掌握这些技巧后,就可以灵活处理各种PHP中的JSON嵌套结构格式化需求,输出符合预期、可读性强的JSON数据。
PHPJSONjson_encodejson_decode嵌套结构修改时间:2026-06-07 01:48:12