引言: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();?>