PHP JSON
PHP 的 JSON 处理功能是处理和生成 JSON(JavaScript Object Notation)数据的核心工具,广泛用于 Web 开发、API 数据交换等场景。PHP 提供了内置的 JSON 扩展(默认启用),通过 json_encode()
和 json_decode()
等函数实现 JSON 数据的编码和解码。以下是对 PHP JSON 功能的中文讲解,涵盖核心概念、常用函数、选项、以及实际应用场景。
1. 什么是 JSON?
JSON 是一种轻量级的数据交换格式,易于阅读和编写,同时易于机器解析和生成。它基于键值对结构,支持字符串、数字、布尔值、数组、对象和 null 类型。PHP 的 JSON 功能允许开发者将 PHP 数据结构(如数组、对象)转换为 JSON 格式,或者将 JSON 字符串解析为 PHP 数据。
2. 核心函数
PHP 的 JSON 扩展提供了以下主要函数:
json_encode($value, $options = 0, $depth = 512)
将 PHP 变量(如数组、对象)转换为 JSON 字符串。$value
:要编码的数据。$options
:编码选项(如JSON_PRETTY_PRINT
)。$depth
:最大嵌套深度(默认 512)。- 返回值:JSON 字符串,失败时返回
false
。 json_decode($json, $assoc = false, $depth = 512, $options = 0)
将 JSON 字符串解析为 PHP 变量。$json
:要解码的 JSON 字符串。$assoc
:是否将对象转换为关联数组(true
返回数组,false
返回对象)。$depth
:最大嵌套深度。$options
:解码选项。- 返回值:解析后的 PHP 数据,失败时返回
null
。 json_last_error()
返回最近一次 JSON 操作的错误代码。json_last_error_msg()
返回最近一次 JSON 操作的错误消息。
3. 使用方法
3.1 使用 json_encode()
编码数据
<?php
// 简单数组
$array = ['name' => '张三', 'age' => 25, 'city' => '上海'];
$json = json_encode($array);
echo $json;
// 输出: {"name":"张三","age":25,"city":"上海"}
// 使用 JSON_PRETTY_PRINT 格式化输出
$json_pretty = json_encode($array, JSON_PRETTY_PRINT);
echo $json_pretty;
/* 输出:
{
"name": "张三",
"age": 25,
"city": "上海"
}
*/
?>
3.2 使用 json_decode()
解码数据
<?php
$json = '{"name":"张三","age":25,"city":"上海"}';
// 解码为对象 (默认)
$data = json_decode($json);
echo $data->name; // 输出: 张三
// 解码为关联数组
$data = json_decode($json, true);
echo $data['name']; // 输出: 张三
?>
3.3 处理中文字符
PHP 的 JSON 编码默认会将非 ASCII 字符(如中文)编码为 Unicode 转义序列(\uXXXX
)。要直接输出中文,可以使用 JSON_UNESCAPED_UNICODE
选项:
<?php
$array = ['name' => '张三', 'city' => '上海'];
$json = json_encode($array, JSON_UNESCAPED_UNICODE);
echo $json;
// 输出: {"name":"张三","city":"上海"}
?>
3.4 错误处理
JSON 操作可能因格式错误或数据问题失败,可通过 json_last_error()
和 json_last_error_msg()
检查错误:
<?php
$invalid_json = '{"name":"张三", "age":}'; // 无效的 JSON
$data = json_decode($invalid_json);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON 错误: " . json_last_error_msg();
}
// 输出: JSON 错误: Syntax error
?>
4. 常用选项
json_encode()
和 json_decode()
支持多种选项,用于控制编码和解码行为。
4.1 json_encode()
选项
JSON_PRETTY_PRINT
:格式化输出,增加换行和缩进,便于阅读。JSON_UNESCAPED_UNICODE
:不转义 Unicode 字符(如中文)。JSON_UNESCAPED_SLASHES
:不转义斜杠(/
)。JSON_THROW_ON_ERROR
:错误时抛出异常(PHP 7.3+)。JSON_NUMERIC_CHECK
:将数字字符串转换为数字。
示例:
<?php
$array = ['url' => 'http://example.com', 'num' => '123'];
$json = json_encode($array, JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
echo $json;
// 输出: {"url":"http://example.com","num":123}
?>
4.2 json_decode()
选项
JSON_THROW_ON_ERROR
:错误时抛出异常(PHP 7.3+)。JSON_BIGINT_AS_STRING
:将大整数作为字符串处理,避免精度丢失。
示例:
<?php
$json = '{"big_number":12345678901234567890}';
$data = json_decode($json, true, 512, JSON_BIGINT_AS_STRING);
echo $data['big_number']; // 输出: 12345678901234567890 (字符串)
?>
5. 实际应用场景
- API 数据交换:
- 将 PHP 数组编码为 JSON 格式,响应给前端或客户端。
- 解析客户端发送的 JSON 数据,转换为 PHP 数组或对象。
<?php
header('Content-Type: application/json');
$data = ['status' => 'success', 'message' => '操作完成'];
echo json_encode($data, JSON_UNESCAPED_UNICODE);
?>
- 存储配置或数据:
- 将复杂数据结构保存为 JSON 格式到文件或数据库。
<?php
$config = ['theme' => 'dark', 'lang' => 'zh-CN'];
file_put_contents('config.json', json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
?>
- 处理 AJAX 请求:
- 从前端接收 JSON 数据,处理后返回 JSON 响应。
<?php
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if ($data && isset($data['name'])) {
echo json_encode(['response' => '收到: ' . $data['name']], JSON_UNESCAPED_UNICODE);
}
?>
- 调试和日志:
- 使用
JSON_PRETTY_PRINT
输出格式化的 JSON,便于调试。
6. 注意事项
- 中文编码问题:
- 始终使用
JSON_UNESCAPED_UNICODE
处理中文,否则中文会被编码为\uXXXX
形式。
- 错误检查:
- 总是检查
json_last_error()
,以确保 JSON 操作成功。 - 对于 PHP 7.3+,可使用
JSON_THROW_ON_ERROR
简化错误处理:php <?php try { $data = json_encode($array, JSON_THROW_ON_ERROR); } catch (JsonException $e) { echo "JSON 编码失败: " . $e->getMessage(); } ?>
- 性能:
- JSON 处理效率高,但对大数据量(如深度嵌套对象)需注意
$depth
参数,避免超过默认 512 层的限制。
- 安全性:
- 解析不可信的 JSON 数据时,结合 PHP 过滤器(如
FILTER_SANITIZE_STRING
)清理输入,防止安全漏洞。
- 大整数精度:
- 使用
JSON_BIGINT_AS_STRING
避免 JavaScript 无法处理的大整数精度丢失问题。
7. 总结
PHP 的 JSON 功能通过 json_encode()
和 json_decode()
提供了简单高效的方式来处理 JSON 数据。结合丰富的选项(如 JSON_UNESCAPED_UNICODE
、JSON_PRETTY_PRINT
),开发者可以轻松实现数据的编码、解码和格式化。JSON 在 API 开发、数据存储和前端交互中应用广泛,正确使用可以提高代码的健壮性和安全性。
如果需要更具体的示例代码、调试技巧,或有其他问题,请告诉我!