PHP中JSON处理:数据解析与序列化

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 PHP 中处理 JSON:解析与序列化完全指南



JSON(JavaScript 对象表示法)是一种轻量级数据交换格式,广泛应用于 Web 开发。PHP 提供了强大的内置函数来处理 JSON,可以轻松实现 PHP 结构与 JSON 字符串之间的转换。在本文中,我们将详细探讨如何在 PHP 中执行 JSON 的解析(解码)和序列化(编码),以及常见的错误及其处理方式。



什么是 JSON,为什么在 PHP 中需要它?



JSON 是一种基于 JavaScript 语法的文本格式。它用于在服务器和客户端之间传输结构化数据(例如,在 REST API 中)。在 PHP 中,JSON 在以下场景中不可或缺:



  • 与外部 API 交换数据(例如,天气服务、支付系统)
  • 存储配置文件
  • 序列化数据以进行缓存
  • 处理 WebSocket 和 AJAX 请求


自 PHP 5.2.0 版本起,PHP 就开始支持 JSON 处理。所有必要的函数都内置在核心中——无需额外扩展。



数据序列化为 JSON(json_encode)



json_encode() 函数将 PHP 值(数组、对象、字符串、数字)转换为 JSON 字符串。来看一个基本示例:



<?php// 关联数组$user = [    'name' => 'Ivan Petrov',    'age' => 28,    'email' => 'ivan@example.com',    'is_active' => true,    'hobbies' => ['programming', 'chess', 'running']];

// 编码为 JSON$jsonString = json_encode($user, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);echo $jsonString;?>


结果:



{    "name": "Ivan Petrov",    "age": 28,    "email": "ivan@example.com",    "is_active": true,    "hobbies": [        "programming",        "chess",        "running"    ]}


重要的 json_encode 标志



  • JSON_UNESCAPED_UNICODE — 保留西里尔字符(不使用此标志时,俄语字符将被转义为 \\uXXXX)
  • JSON_PRETTY_PRINT — 使用缩进格式化输出,提高可读性
  • JSON_NUMERIC_CHECK — 将数字字符串转换为数字
  • JSON_FORCE_OBJECT — 强制创建对象,即使传入的是空数组


在 PHP 中解析 JSON(json_decode)



json_decode() 函数执行反向转换——从 JSON 字符串转换为 PHP 值。默认情况下,它返回一个对象。要获取关联数组,请传递第二个参数 true:



<?php$jsonString = '{"name":"Ivan Petrov","age":28,"email":"ivan@example.com","is_active":true}';

// 解码为对象$userObject = json_decode($jsonString);echo $userObject->name; // Ivan Petrov

// 解码为关联数组$userArray = json_decode($jsonString, true);echo $userArray['name']; // Ivan Petrov?>


嵌套深度



json_decode() 的第三个参数——depth——限制递归深度。默认值为 512。这可以防止类似"十亿笑攻击"的攻击:



<?php$deepJson = '{"a":{"b":{"c":{"d":"test"}}}}';$data = json_decode($deepJson, true, 3); // 如果深度大于 3,则报错?>


处理 JSON 时的错误处理



当解析无效 JSON 时,json_decode() 返回 null。要获取详细的错误信息,请使用 json_last_error() 和 json_last_error_msg():



<?php$badJson = '{"name": "Ivan", age: 28}'; // 错误:键 age 未加引号

$data = json_decode($badJson, true);

if (json_last_error() !== JSON_ERROR_NONE) {

博客

书籍推荐