PHP如何接收和处理JSON文本:从基础到实践的完整指南
在Web开发中,JSON(JavaScript Object Notation)因其轻量级、易读和跨语言兼容的特性,已成为前后端数据交互的主流格式,PHP作为服务器端脚本语言,经常需要接收客户端发送的JSON数据并进行解析处理,本文将详细介绍PHP接收JSON文本的完整流程,包括数据获取、解析、错误处理及实战案例,帮助开发者快速这一核心技能。
PHP接收JSON文本的基础流程
PHP接收JSON数据通常分为两个核心步骤:获取原始JSON文本和将JSON文本解析为PHP变量,以下是详细说明:
获取原始JSON文本
客户端(如浏览器、移动端)发送JSON数据时,通常通过HTTP请求的POST或GET方法传递,在PHP中,需根据请求方式获取原始输入流:
(1)通过POST请求接收JSON数据
客户端发送JSON数据时,需设置请求头Content-Type: application/json,PHP可通过以下方式获取原始JSON文本:
// 获取原始POST数据(JSON字符串)
$jsonString = file_get_contents('php://input');
php://input是一个只读流,允许读取原始POST数据,不受php.ini中always_populate_raw_post_data配置的影响,是接收JSON数据的推荐方式。
(2)通过GET请求接收JSON数据
若JSON数据通过URL参数传递(如?data={"key":"value"}),需使用$_GET超全局变量获取:
// 获取GET参数中的JSON字符串(需客户端URL编码) $jsonString = $_GET['data'] ?? '';
但需注意:GET请求的JSON数据需进行URL编码(如{"name":"张三"}编码为%7B%22name%22%3A%22%E5%BC%A0%E4%B8%89%22%7D),接收后需先解码:
$urlDecodedString = urldecode($jsonString);
将JSON文本解析为PHP变量
获取JSON字符串后,需使用json_decode()函数将其解析为PHP变量(数组或对象),该函数的语法为:
mixed json_decode(string $json, bool $assoc = false, int $depth = 512, int $options = 0)
$json:待解析的JSON字符串;$assoc:若为true,返回关联数组;若为false(默认),返回对象;$depth:指定递归深度,默认512;$options:解析选项,如JSON_BIGINT_AS_STRING(将大整数转为字符串,避免精度丢失)。
示例:解析JSON为关联数组
$jsonString = '{"name":"张三","age":25,"hobbies":["编程","阅读"]}';
// 解析为关联数组
$data = json_decode($jsonString, true);
// 访问数据
echo $data['name']; // 输出:张三
echo $data['hobbies'][0]; // 输出:编程
示例:解析JSON为对象
$jsonString = '{"name":"张三","age":25}';
// 解析为对象(默认)
$data = json_decode($jsonString);
// 访问数据
echo $data->name; // 输出:张三
echo $data->age; // 输出:25
JSON解析中的错误处理
当JSON字符串格式不正确(如语法错误、数据类型不匹配)时,json_decode()会返回null,并设置json_last_error()和json_last_error_msg(),解析JSON后必须进行错误检查,避免后续操作因数据无效而报错。
常见JSON错误及处理方法
| 错误代码 | 错误常量 | 错误信息 | 触发场景 |
|---|---|---|---|
| 0 | JSON_ERROR_NONE |
无错误 | 解析成功 |
| 4 | JSON_ERROR_SYNTAX |
语法错误 | JSON字符串格式不正确(如缺少引号、逗号) |
| 3 | JSON_ERROR_DEPTH |
超出最大递归深度 | JSON数据嵌套层级超过$depth参数 |
| 5 | JSON_ERROR_STATE_MISMATCH |
无效或异常的JSON | JSON字符串不完整(如未闭合的括号) |
| 4194304 | JSON_ERROR_UTF8 |
UTF-8编码错误 | JSON字符串包含非法UTF-8字符 |
错误处理示例
$jsonString = '{"name":"张三","age":25,'; // 故意制造语法错误(缺少闭合括号)
$data = json_decode($jsonString);
if (json_last_error() !== JSON_ERROR_NONE) {
die('JSON解析失败:' . json_last_error_msg());
}
// 安全访问数据
echo $data->name ?? '未知姓名';
处理UTF-8编码错误
若JSON字符串包含非法UTF-8字符(如BOM头),需先清理:
$jsonString = trim($jsonString, "\xEF\xBB\xBF"); // 移除BOM头
$data = json_decode($jsonString, true);
if (json_last_error() === JSON_ERROR_UTF8) {
die('JSON包含非法UTF-8字符');
}
实战案例:接收并处理前端JSON数据
案例1:通过AJAX提交JSON数据
前端使用fetch API发送JSON数据,后端PHP接收并解析:
前端代码(JavaScript)
const userData = {
name: '李四',
email: 'lisi@example.com',
hobbies: ['音乐', '旅行']
};
fetch('api.php', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(userData)
})
.then(response => response.json())
.then(data => console.log('服务器响应:', data))
.catch(error => console.error('请求失败:', error));
后端代码(PHP:api.php)
<?php
header('Content-Type: application/json; charset=utf-8');
// 1. 获取原始JSON数据
$jsonString = file_get_contents('php://input');
// 2. 解析JSON并处理错误
$data = json_decode($jsonString, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo json_encode(['status' => 'error', 'message' => 'JSON格式错误:' . json_last_error_msg()]);
exit;
}
// 3. 处理数据(示例:存入数据库)
$name = $data['name'] ?? '';
$email = $data['email'] ?? '';
$hobbies = $data['hobbies'] ?? [];
// 模拟数据库操作(实际项目中使用PDO或MySQLi)
if (!empty($name) && !empty($email)) {
// 假设数据库操作成功
$response = [
'status' => 'success',
'message' => '数据接收成功',
'data' => [
'name' => $name,
'email' => $email,
'hobbies' => $hobbies
]
];
} else {
$response = ['status' => 'error', 'message' => '姓名和邮箱不能为空'];
}
// 4. 返回JSON响应
echo json_encode($response, JSON_UNESCAPED_UNICODE);
?>
案例2:通过GET请求传递JSON参数
前端通过URL传递JSON数据(需编码),后端解码并解析:
前端URL示例
https://example.com/api.php?data=%7B%22id%22%3A%22123%22%2C%22action%22%3A%22get_info%22%7D
后端代码(PHP)
<?php
header('Content-Type: application/json; charset=utf-8');
// 1. 获取GET参数并URL解码
$jsonString = urldecode($_GET['data'] ?? '');
// 2. 解析JSON
$data = json_decode($jsonString, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo json_encode(['status' => 'error', 'message' => 'JSON参数无效']);
exit;
}
// 3. 处理数据(示例:根据ID查询信息)
$id = $data['id'] ?? '';
$action = $data['action'] ?? '';
if ($action === 'get_info' && !empty($id)) {
// 模拟查询结果
$userInfo = [
'id' => $id,
'name' => '王五',
'age' => 30
];
echo json_encode(['status' => 'success', 'data' => $userInfo]);
} else {
echo json_encode(['status' => 'error', 'message' => '参数不完整']);
}
?>



还没有评论,来说两句吧...