JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于 前后端数据交互,例如,Web 应用和 RESTful API 的通信。PHP 提供了内建的 JSON 扩展,使得 PHP 在处理 JSON 数据时非常方便。
本文将详细介绍如何在 PHP 中使用 JSON,包括 JSON 编码、解码、错误处理等内容。
1. JSON 编码(json_encode())
json_encode() 函数将 PHP 数据(数组或对象)转换为 JSON 格式字符串。
基本示例:将数组转换为 JSON
$array = [
"name" => "Tom",
"age" => 25,
"city" => "New York"
];
$json_data = json_encode($array);
echo $json_data; // 输出: {"name":"Tom","age":25,"city":"New York"}
📌 这里的 数组 被编码为 JSON 格式。
示例:将对象转换为 JSON
class Person {
public $name;
public $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
$person = new Person("Tom", 25);
$json_data = json_encode($person);
echo $json_data; // 输出: {"name":"Tom","age":25}
📌 对象 也能被 json_encode() 转换为 JSON 格式字符串。
控制选项(JSON_PRETTY_PRINT)
$array = [
"name" => "Tom",
"age" => 25,
"city" => "New York"
];
$json_data = json_encode($array, JSON_PRETTY_PRINT);
echo $json_data;
📌 JSON_PRETTY_PRINT 选项使 JSON 数据更加 可读,适合调试输出。
2. JSON 解码(json_decode())
json_decode() 函数将 JSON 格式字符串 转换为 PHP 数据(数组或对象)。
基本示例:将 JSON 字符串转换为 PHP 数组
$json_data = '{"name":"Tom","age":25,"city":"New York"}';
$array = json_decode($json_data, true);
print_r($array);
📌 设置第二个参数为 true,返回值为 关联数组。
示例:将 JSON 字符串转换为 PHP 对象
$json_data = '{"name":"Tom","age":25,"city":"New York"}';
$object = json_decode($json_data);
echo $object->name; // 输出: Tom
📌 如果不传递第二个参数,默认返回值为 对象。
错误处理(json_last_error())
在解码 JSON 数据时,可能会遇到格式错误。通过 json_last_error() 可以获取 解码错误。
$json_data = '{"name":"Tom", "age":25,}'; // JSON 格式错误(最后有多余的逗号)
$data = json_decode($json_data);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON 解码错误:" . json_last_error_msg(); // 输出: Syntax error
}
📌 json_last_error_msg() 返回错误信息,帮助你快速定位问题。
3. JSON 错误处理
在编码或解码 JSON 数据时,如果出现错误,可以通过以下常用函数进行错误检查:
常见 JSON 错误常量
JSON_ERROR_NONE: 没有错误。JSON_ERROR_DEPTH: 最大堆栈深度超出限制。JSON_ERROR_STATE_MISMATCH: 无效或异常的 JSON 状态。JSON_ERROR_CTRL_CHAR: 控制字符错误。JSON_ERROR_SYNTAX: 语法错误。JSON_ERROR_UTF8: UTF-8 编码错误。
示例:捕获 JSON 编码错误
$data = ["name" => "Tom", "age" => "\xB1\x31"]; // 包含非法字符
$json_data = json_encode($data);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "编码错误:" . json_last_error_msg(); // 输出: Malformed UTF-8 characters, possibly incorrectly encoded
}
📌 在这个例子中,数据包含非法的 UTF-8 字符,因此 json_last_error() 会返回错误。
4. JSON 数据处理的高级选项
PHP 提供了多种编码选项,允许你更精确地控制 JSON 数据的输出。
常见选项
JSON_HEX_TAG: 将<和>转换为\u003C和\u003E。JSON_HEX_AMP: 将&转换为\u0026。JSON_HEX_APOS: 将'转换为\u0027。JSON_HEX_QUOT: 将"转换为\u0022。JSON_FORCE_OBJECT: 强制 JSON 对象的输出。JSON_UNESCAPED_UNICODE: 不转义 Unicode 字符(默认转义)。JSON_UNESCAPED_SLASHES: 不转义斜杠。
示例:使用多个选项
$data = [
"name" => "Tom & Jerry",
"city" => "New York"
];
$json_data = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $json_data;
📌 这里的 JSON_UNESCAPED_UNICODE 使得 Unicode 字符不被转义,JSON_PRETTY_PRINT 则让 JSON 输出更加可读。
5. 示例:将 JSON 用于 AJAX 请求
在 Web 开发中,JSON 经常作为 前后端数据交换 的格式。例如,通过 AJAX 向服务器发送 JSON 数据,并从服务器返回 JSON 格式的响应。
前端(JavaScript)代码
let data = {
name: "Tom",
age: 25
};
fetch("process.php", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(data)
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
后端(PHP)代码(process.php)
// 获取 JSON 数据并解码
$data = json_decode(file_get_contents("php://input"), true);
// 处理数据
$name = $data["name"];
$age = $data["age"];
// 返回 JSON 响应
$response = ["status" => "success", "name" => $name, "age" => $age];
echo json_encode($response);
📌 这个例子展示了如何通过 AJAX 将 JSON 数据发送到服务器,后端 PHP 解析该数据,并返回一个 JSON 响应。
总结
| 功能 | 函数 | 示例 |
|---|---|---|
| 编码 | json_encode() | json_encode(["name" => "Tom", "age" => 25]) |
| 解码 | json_decode() | json_decode('{"name":"Tom","age":25}') |
| 错误处理 | json_last_error() | json_last_error_msg() |
| 自定义选项 | JSON_HEX_TAG, JSON_PRETTY_PRINT 等 | json_encode($data, JSON_PRETTY_PRINT) |
| 发送/接收 JSON | file_get_contents("php://input") | json_decode(file_get_contents("php://input")) |
✅ PHP JSON 扩展使得与前端的交互变得更加简洁、安全,广泛用于现代 Web 开发中的数据传输!
更多详细内容请关注其他相关文章!