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. 实际应用场景

  1. API 数据交换
  • 将 PHP 数组编码为 JSON 格式,响应给前端或客户端。
  • 解析客户端发送的 JSON 数据,转换为 PHP 数组或对象。
   <?php
   header('Content-Type: application/json');
   $data = ['status' => 'success', 'message' => '操作完成'];
   echo json_encode($data, JSON_UNESCAPED_UNICODE);
   ?>
  1. 存储配置或数据
  • 将复杂数据结构保存为 JSON 格式到文件或数据库。
   <?php
   $config = ['theme' => 'dark', 'lang' => 'zh-CN'];
   file_put_contents('config.json', json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
   ?>
  1. 处理 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);
   }
   ?>
  1. 调试和日志
  • 使用 JSON_PRETTY_PRINT 输出格式化的 JSON,便于调试。

6. 注意事项

  1. 中文编码问题
  • 始终使用 JSON_UNESCAPED_UNICODE 处理中文,否则中文会被编码为 \uXXXX 形式。
  1. 错误检查
  • 总是检查 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(); } ?>
  1. 性能
  • JSON 处理效率高,但对大数据量(如深度嵌套对象)需注意 $depth 参数,避免超过默认 512 层的限制。
  1. 安全性
  • 解析不可信的 JSON 数据时,结合 PHP 过滤器(如 FILTER_SANITIZE_STRING)清理输入,防止安全漏洞。
  1. 大整数精度
  • 使用 JSON_BIGINT_AS_STRING 避免 JavaScript 无法处理的大整数精度丢失问题。

7. 总结

PHP 的 JSON 功能通过 json_encode()json_decode() 提供了简单高效的方式来处理 JSON 数据。结合丰富的选项(如 JSON_UNESCAPED_UNICODEJSON_PRETTY_PRINT),开发者可以轻松实现数据的编码、解码和格式化。JSON 在 API 开发、数据存储和前端交互中应用广泛,正确使用可以提高代码的健壮性和安全性。

如果需要更具体的示例代码、调试技巧,或有其他问题,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注