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

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

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

开始课程

引言:PHP 为何需要 JSON?

JSON(JavaScript 对象表示法)是一种轻量级数据交换格式,已成为 Web API、配置文件以及存储结构化信息的事实标准。尽管 JSON 起源于 JavaScript,但它得到了所有现代编程语言(包括 PHP)的完美支持。

在 PHP 中,处理 JSON 是通过两个核心函数原生实现的:json_encode()(序列化——将 PHP 数据转换为 JSON 字符串)和 json_decode()(反序列化——将 JSON 字符串解析回 PHP 结构)。在本文中,我们将深入探讨如何有效使用这些工具、处理错误并在实际项目中应用 JSON。



1. 数据序列化:json_encode() 函数

json_encode() 函数将 PHP 值(数组、对象、字符串、数字)转换为 JSON 格式的字符串。当你需要向客户端发送数据(例如通过 AJAX)或将其保存到文件时,这非常有用。



基本语法与示例

<?php// 简单数组$colors = ["red", "green", "blue"];echo json_encode($colors);// 输出:["red","green","blue"]

// 关联数组$user = [ "name" => "Ivan", "age" => 30, "is_admin" => false];echo json_encode($user);// 输出:{"name":"Ivan","age":30,"is_admin":false}?>


实用的 json_encode() 标志

该函数支持第二个参数——一个标志位掩码。我们来看看最常用的几个:

  • JSON_PRETTY_PRINT——使用缩进格式化输出,便于阅读。
  • JSON_UNESCAPED_UNICODE——不转义西里尔字母和其他 Unicode 字符(否则俄文字母会变成 \\uXXXX)。
  • JSON_NUMERIC_CHECK——将包含数字的字符串转换为数字类型。
  • JSON_FORCE_OBJECT——即使对索引数组也强制将数组转换为对象。


<?php$data = ["name" => "Anna", "age" => "25"];

// 无标志echo json_encode($data);// {"name":"\\u0410\\u043d\\u043d\\u0430","age":"25"}

// 使用标志echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);/*{ "name": "Anna", "age": "25"}*/?>


2. 解析 JSON:json_decode() 函数

json_decode() 函数执行反向操作——将 JSON 字符串转换回 PHP 变量。默认情况下,它返回一个 stdClass 类的对象,但你也可以要求返回关联数组。



解析为对象与数组

<?php$jsonString = '{"name":"Peter","age":28,"skills":["PHP","MySQL"]}';

// 默认——对象$obj = json_decode($jsonString);echo $obj->name; // Peterecho $obj->skills[0]; // PHP

// 使用 true 标志——关联数组$arr = json_decode($jsonString, true);echo $arr["name"]; // Peterecho $arr["skills"][1]; // MySQL?>


递归深度

第三个参数 depth 限制嵌套深度。默认值为 512 层。这是针对“十亿笑声攻击”等类型攻击的保护措施:

<?php$malicious = '{"a":{"b":{"c":"d"}}}';$result = json_decode($malicious, false, 2); // 最大 2 层// 由于超出深度,将返回 null?>


3. 处理 JSON 时的错误处理

最常见的问题之一是 JSON 字符串无效。PHP 在解析错误时不会抛出异常,而是返回 null。要了解哪里出错,请使用 json_last_error() 和 json_last_error_msg() 函数。



错误检查

<?php$badJson = '{"name": "Error, missing quote}';$data = json_decode($badJson);

if (json_last_error() !== JSON_ERROR_NONE) { echo "JSON 错误:" . json_last_error_msg();?>

博客

书籍推荐