做后台开发,天天跟 JSON 打交道。前端甩过来一串 JSON,微信回调给你一段 JSON,调第三方 API 返回的还是 JSON——PHP 怎么接、怎么拆、怎么改、怎么发?其实没那么玄乎。
接收 JSON 请求
比如前端用 fetch 发了个 POST:
fetch('/api/save', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name: '老张', score: 89 }) });PHP 端不用 $_POST,得读原始输入流:
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
echo json_encode(['error' => 'JSON 格式不对']);
exit;
}
// $data['name'] 就是 '老张'把数组转成 JSON 发出去
查完数据库,想返回给前端,别拼字符串,直接 json_encode:
$user = ['id' => 123, 'nickname' => '智享君', 'tags' => ['教程', 'PHP', '实战']];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($user, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);加 JSON_UNESCAPED_UNICODE 是为了中文不乱码,加 JSON_PRETTY_PRINT 是方便调试时看格式(上线建议去掉)。
处理嵌套和空值的小坑
遇到前端传来 {"price": null},json_decode 后会变成 null,但 PHP 里直接用 $data['price'] > 0 会告警。稳妥写法:
$price = $data['price'] ?? 0;
// 或更准一点:
$price = is_numeric($data['price']) ? (float)$data['price'] : 0;再比如对方返回了带时间戳的 JSON:{"created_at": 1715623489},PHP 里想转成「2024-05-14 10:04:49」,一行搞定:
$time = date('Y-m-d H:i:s', $data['created_at']);批量导入 JSON 文件到 MySQL
运营同事丢来一个 users.json,里面是几百条用户数据,想快速入库。先读文件,再循环插入(记得预处理防注入):
$json = file_get_contents('users.json');
$users = json_decode($json, true);
$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)');
foreach ($users as $u) {
$stmt->execute([$u['name'], $u['email'] ?? '']);
}如果数据量特别大(上万条),建议分批 array_chunk + 事务包住,不然容易超时或锁表。
JSON 不是洪水猛兽,它就是个格式规整的字符串。PHP 的 json_encode 和 json_decode 就是两把小刀,削得动,也够快。用熟了,连调试都省得开 Postman —— var_dump(json_decode(file_get_contents('test.json'), true));,回车就出结果。