PHP中的JSON操作:实战解析与序列化
JSON(JavaScript对象表示法)是一种轻量级的数据交换格式,已成为Web API和配置文件的通用标准。在PHP中,JSON操作是原生支持的,无需安装额外扩展。本文将结合实际示例,讲解如何在PHP中执行JSON的解析与序列化,并学习错误处理及嵌套结构的操作。
什么是JSON序列化与解析?
在进入代码之前,我们先明确关键概念:
- 序列化 — 将PHP变量(数组、对象)转换为JSON字符串。
- 解析(反序列化) — 反向过程:将JSON字符串转换为PHP变量。
PHP提供了两个主要函数来完成这些任务:json_encode() 和 json_decode()。下面我们来详细了解它们。
使用 json_encode() 将数据序列化为JSON
json_encode() 函数接受一个PHP值(资源类型除外),并返回其JSON表示。来看一个基本示例:
<?php$user = [ 'name' => '伊万·彼得罗夫', 'age' => 28, 'email' => 'ivan@example.com', 'is_active' => true];
$json = json_encode($user);echo $json;// 输出: {"name":"伊万·彼得罗夫","age":28,"email":"ivan@example.com","is_active":true}?>默认情况下,json_encode() 会将关联数组转换为JSON对象。如果需要得到数组,请使用 JSON_FORCE_OBJECT 标志:
<?php$numbers = [10, 20, 30];echo json_encode($numbers); // [10,20,30]echo json_encode($numbers, JSON_FORCE_OBJECT); // {"0":10,"1":20,"2":30}?>json_encode() 的实用标志
JSON_PRETTY_PRINT— 格式化输出,增加缩进以提高可读性。JSON_UNESCAPED_UNICODE— 不转义Unicode字符(如俄文字母)。JSON_NUMERIC_CHECK— 将包含数字的字符串转换为数字类型。
<?php$data = ['product' => '书籍', 'price' => '1500'];
// 美观输出,保留俄文字符echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);/*{ "product": "书籍", "price": "1500"}*/
// 自动将字符串 '1500' 转换为数字echo json_encode($data, JSON_NUMERIC_CHECK);// {"product":"书籍","price":1500}?>使用 json_decode() 在PHP中解析JSON
json_decode() 函数接受一个JSON字符串,并将其转换为PHP变量。第二个参数 $associative 决定返回关联数组(true)还是对象(false,默认值)。
<?php$jsonString = '{"name":"玛丽亚","age":25,"hobbies":["阅读","旅行"]}';
// 解析为对象$obj = json_decode($jsonString);echo $obj->name; // 玛丽亚echo $obj->hobbies[0]; // 阅读
// 解析为关联数组$arr = json_decode($jsonString, true);echo $arr['age']; // 25?>处理嵌套结构
JSON通常包含嵌套的对象和数组。来看一个天气API的示例:
<?php$weatherJson = '{ "city": "莫斯科", "temperature": { "current": -5, "feels_like": -8 }, "forecast": [ {"day": "周一", "temp": -3}, {"day": "周二", "temp": -1} ]}';
$weather = json_decode($weatherJson, true);
echo "当前温度: " . $weather['temperature']['current'] . "°C";echo "体感温度: " . $weather['temperature']['feels_like'] . "°C";
foreach ($weather['forecast'] as $day) { echo "{$day['day']}: {$day['temp']}°C";}?>