<?php练功房

第 5 章 · Web 开发 · 第 5.2 课

JSON 与接口

约 12 分钟

JSON 是前后端、服务和服务之间交换数据最常用的格式。PHP 的数组和 JSON 可以直接互相转换:

  • json_encode($data):PHP 数组 / 对象 → JSON 字符串
  • json_decode($json, true):JSON 字符串 → PHP 关联数组(第二个参数不写 true 会得到对象)

默认情况下中文会被转成 \u4e2d 这样的形式,加上 JSON_UNESCAPED_UNICODE 就能原样输出;JSON_PRETTY_PRINT 会加上缩进和换行,方便阅读。

写一个 JSON 接口

一个返回 JSON 的 PHP 接口通常长这样:先声明返回内容的类型,校验参数,出错时设置合适的 HTTP 状态码。前端用 fetch('/api/article.php?id=1') 就能拿到数据。

<?php
header('Content-Type: application/json; charset=utf-8');

$id = (int) ($_GET['id'] ?? 0);
if ($id <= 0) {
    http_response_code(400);
    echo json_encode(['ok' => false, 'error' => 'id 无效'], JSON_UNESCAPED_UNICODE);
    exit;
}

echo json_encode(['ok' => true, 'data' => ['id' => $id, 'title' => '示例文章']], JSON_UNESCAPED_UNICODE);

这个网站保存学习进度用的就是这样的接口。

选择题

json_decode('{"a":1}') 不传第二个参数,得到的是什么?

练习 1

订单总价

$json 是一个订单里的商品列表。解析它,计算总价(单价 × 数量,再加起来),输出:

总价:22

练习 2

统一的接口返回格式

写函数 apiResponse(bool $ok, $data = null, string $error = ''): string,返回 JSON 字符串,中文不要转义:

  • 成功时:{"ok":true,"data":...}
  • 失败时:{"ok":false,"error":"..."}
apiResponse(true, ['id' => 1]);          // {"ok":true,"data":{"id":1}}
apiResponse(false, null, '没找到');       // {"ok":false,"error":"没找到"}