本文目录导读:

在PHP项目中处理JSON数据主要涉及编码和解码两个核心操作,以及一些常见的场景处理,以下是完整的处理指南:
核心函数
JSON编码(PHP数组/对象 → JSON字符串)
// 编码数组
$data = [
'name' => '张三',
'age' => 25,
'skills' => ['PHP', 'MySQL', 'JavaScript']
];
$jsonString = json_encode($data, JSON_UNESCAPED_UNICODE);
echo $jsonString; // {"name":"张三","age":25,"skills":["PHP","MySQL","JavaScript"]}
// 编码对象
class User {
public $name = '李四';
public $age = 30;
}
$user = new User();
echo json_encode($user); // {"name":"李四","age":30}
JSON解码(JSON字符串 → PHP数组/对象)
$jsonStr = '{"name":"王五","age":28,"city":"北京"}';
// 解码为数组
$array = json_decode($jsonStr, true);
print_r($array); // Array ( [name] => 王五 [age] => 28 [city] => 北京 )
// 解码为对象
$object = json_decode($jsonStr);
echo $object->name; // 王五
常用配置选项
// 常用选项常量
$options = [
JSON_UNESCAPED_UNICODE, // 中文不转义
JSON_PRETTY_PRINT, // 格式化输出
JSON_FORCE_OBJECT, // 强制编码为对象
JSON_NUMERIC_CHECK, // 数字字符串转为数字
JSON_UNESCAPED_SLASHES, // 不转义斜杠
];
// 组合使用
$data = ['name' => '测试', 'url' => 'https://example.com'];
echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
错误处理
$jsonStr = '{invalid json}';
$result = json_decode($jsonStr);
if (json_last_error() !== JSON_ERROR_NONE) {
// 获取错误信息
echo 'JSON错误: ' . json_last_error_msg();
// 错误代码
switch (json_last_error()) {
case JSON_ERROR_DEPTH:
echo ' - 超出最大深度';
break;
case JSON_ERROR_SYNTAX:
echo ' - 语法错误';
break;
case JSON_ERROR_UTF8:
echo ' - 编码错误';
break;
default:
echo ' - 未知错误';
}
}
实际项目中的应用场景
场景1:API接口响应
// 统一响应格式
function apiResponse($code, $message, $data = null) {
$response = [
'code' => $code,
'message' => $message,
'data' => $data,
'timestamp' => time()
];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE);
exit;
}
// 使用示例
apiResponse(200, '成功', ['id' => 1, 'username' => 'admin']);
场景2:接收前端POST数据
// 前端发送的JSON数据
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if ($data === null && json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo json_encode(['error' => '无效的JSON数据']);
exit;
}
// 处理数据...
$name = $data['name'] ?? '';
$email = $data['email'] ?? '';
}
场景3:读取JSON配置文件
// config.json
// {
// "database": {
// "host": "localhost",
// "port": 3306,
// "name": "test"
// }
// }
function loadConfig($filePath) {
if (!file_exists($filePath)) {
throw new Exception('配置文件不存在');
}
$content = file_get_contents($filePath);
$config = json_decode($content, true);
if ($config === null) {
throw new Exception('配置文件格式错误: ' . json_last_error_msg());
}
return $config;
}
// 使用
$config = loadConfig('config.json');
$dbHost = $config['database']['host'];
场景4:处理大文件JSON
// 逐行读取大JSON文件
function processLargeJson($filePath, $callback) {
$handle = fopen($filePath, 'r');
if ($handle) {
while (($line = fgets($handle)) !== false) {
$data = json_decode($line, true);
if ($data !== null) {
$callback($data);
}
}
fclose($handle);
}
}
// 使用
processLargeJson('data.jsonl', function($item) {
echo "处理: " . $item['id'] . "\n";
});
场景5:JSON数据验证
function validateJsonStructure($data, $requiredKeys = []) {
if (!is_array($data)) {
return ['valid' => false, 'error' => '数据必须是数组'];
}
foreach ($requiredKeys as $key => $type) {
if (!isset($data[$key])) {
return ['valid' => false, 'error' => "缺少必需字段: $key"];
}
if (gettype($data[$key]) !== $type) {
return ['valid' => false, 'error' => "字段 $key 类型错误,期望: $type"];
}
}
return ['valid' => true, 'error' => null];
}
// 使用
$jsonData = json_decode($input, true);
$validation = validateJsonStructure($jsonData, [
'name' => 'string',
'age' => 'integer',
'email' => 'string'
]);
if (!$validation['valid']) {
echo json_encode(['error' => $validation['error']]);
exit;
}
性能优化建议
// 1. 批量处理时复用对象
$jsonStrings = ['{"a":1}', '{"b":2}', '{"c":3}'];
$result = [];
foreach ($jsonStrings as $str) {
$result[] = json_decode($str, true);
}
// 2. 避免重复编码
$jsonString = json_encode($data);
for ($i = 0; $i < 1000; $i++) {
// 不要在这里重复json_encode
processData($jsonString); // 直接使用已编码的字符串
}
// 3. 使用JSON_THROW_ON_ERROR(PHP 7.3+)
try {
$data = json_decode($jsonStr, true, 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
echo 'JSON错误: ' . $e->getMessage();
}
安全注意事项
// 1. 防止XSS攻击
$userInput = '<script>alert("xss")</script>';
$safeJson = json_encode(['message' => htmlspecialchars($userInput)]);
// 2. 限制递归深度
$data = json_decode($jsonStr, true, 10); // 最大深度10层
// 3. 验证数据类型
$jsonData = json_decode($input, true);
if (!is_numeric($jsonData['id'] ?? '')) {
throw new Exception('ID必须是数字');
}
处理JSON数据的关键点:
- 使用
json_encode()编码,json_decode()解码 - 始终检查错误(
json_last_error()) - 设置正确的Content-Type头
- 对于用户输入的数据进行验证和清理
- 使用合适的选项参数(如
JSON_UNESCAPED_UNICODE)
这些实践可以帮你高效安全地在PHP项目中处理JSON数据。