PHP项目JSON数据如何编码返回

wen PHP项目 25

本文目录导读:

PHP项目JSON数据如何编码返回

  1. 基本JSON编码返回
  2. 完整的使用示例
  3. 常用json_encode选项
  4. 框架中的实现(ThinkPHP/Laravel)
  5. 完整的API返回规范
  6. 注意事项
  7. 中间件方式(推荐)

在PHP项目中,JSON数据的编码和返回主要通过以下方式实现:

基本JSON编码返回

<?php
// 设置响应头
header('Content-Type: application/json; charset=utf-8');
// 准备数据
$data = [
    'code' => 200,
    'message' => 'success',
    'data' => [
        'id' => 1,
        'name' => '张三',
        'age' => 25
    ]
];
// 编码并输出
echo json_encode($data, JSON_UNESCAPED_UNICODE);
exit;

完整的使用示例

<?php
class JsonResponse {
    /**
     * 返回JSON格式数据
     * @param mixed $data 数据内容
     * @param string $message 提示信息
     * @param int $code 状态码
     * @param int $httpCode HTTP状态码
     */
    public static function success($data = [], $message = 'success', $code = 200, $httpCode = 200) {
        $result = [
            'code' => $code,
            'message' => $message,
            'data' => $data
        ];
        // 设置响应头
        header('Content-Type: application/json; charset=utf-8');
        http_response_code($httpCode);
        // 编码输出
        echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
        exit;
    }
    /**
     * 返回错误JSON
     */
    public static function error($message = 'error', $code = 400, $httpCode = 400, $data = []) {
        $result = [
            'code' => $code,
            'message' => $message,
            'data' => $data
        ];
        header('Content-Type: application/json; charset=utf-8');
        http_response_code($httpCode);
        echo json_encode($result, JSON_UNESCAPED_UNICODE);
        exit;
    }
}
// 使用示例
// JsonResponse::success(['user' => '张三']);
// JsonResponse::error('参数错误');

常用json_encode选项

<?php
$data = [
    'name' => '张三',
    'email' => 'test@example.com',
    'address' => "北京\n上海"  // 包含换行
];
// 常用选项组合
echo json_encode($data, 
    JSON_UNESCAPED_UNICODE |    // 中文不转义
    JSON_UNESCAPED_SLASHES |    // 反斜杠不转义
    JSON_PRETTY_PRINT |         // 格式化输出
    JSON_NUMERIC_CHECK          // 数字字符串转为数字
);

框架中的实现(ThinkPHP/Laravel)

ThinkPHP

// 控制器中
public function index()
{
    $data = [
        'name' => '张三',
        'age' => 25
    ];
    return json($data);  // 自动设置header并返回JSON
}
// 或使用
return response()->json($data);

Laravel

// 控制器中
public function index()
{
    return response()->json([
        'name' => '张三',
        'age' => 25
    ]);
}
// 自定义状态码
return response()->json($data, 200);

完整的API返回规范

<?php
class ApiController {
    // 返回成功
    protected function success($data = [], $message = '操作成功', $code = 0) {
        $result = [
            'code' => $code,
            'message' => $message,
            'data' => $data,
            'timestamp' => time()  // 添加时间戳
        ];
        return response()->json($result);
    }
    // 返回失败
    protected function error($message = '操作失败', $code = -1, $data = []) {
        $result = [
            'code' => $code,
            'message' => $message,
            'data' => $data,
            'timestamp' => time()
        ];
        return response()->json($result);
    }
    // 分页数据返回
    protected function paginate($list, $total, $page, $size) {
        return $this->success([
            'list' => $list,
            'total' => $total,
            'page' => $page,
            'size' => $size,
            'pages' => ceil($total / $size)
        ]);
    }
}

注意事项

编码前检查

// 检查JSON编码是否有错误
$json = json_encode($data, JSON_UNESCAPED_UNICODE);
if ($json === false) {
    // 处理错误
    $error = json_last_error_msg();
    echo json_encode(['error' => $error]);
}

处理特殊字符

// 递归清理数据中的特殊字符
function cleanData($data) {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[$key] = cleanData($value);
        }
    } else if (is_string($data)) {
        // 移除控制字符
        $data = preg_replace('/[\x00-\x1F\x7F]/', '', $data);
    }
    return $data;
}
$cleanData = cleanData($data);
echo json_encode($cleanData, JSON_UNESCAPED_UNICODE);

中间件方式(推荐)

<?php
// 中间件
class JsonResponseMiddleware {
    public function handle($request, $next) {
        $response = $next($request);
        // 设置统一的JSON响应头
        header('Content-Type: application/json; charset=utf-8');
        header('Access-Control-Allow-Origin: *');  // CORS
        header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE');
        header('Access-Control-Allow-Headers: Content-Type, Authorization');
        // 如果返回的是数组,自动转为JSON
        if (is_array($response)) {
            echo json_encode($response, JSON_UNESCAPED_UNICODE);
            exit;
        }
        return $response;
    }
}
  1. 统一响应格式:始终使用相同的JSON结构
  2. 设置正确的HeaderContent-Type: application/json
  3. 使用JSON_UNESCAPED_UNICODE:避免中文转义
  4. 状态码规范:使用HTTP状态码 + 业务状态码
  5. 错误处理:捕获并处理JSON编码错误
  6. 安全考虑:避免输出敏感信息

这样的JSON返回方式既规范又安全,适合在PHP项目中使用。

抱歉,评论功能暂时关闭!