本文目录导读:

在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;
}
}
- 统一响应格式:始终使用相同的JSON结构
- 设置正确的Header:
Content-Type: application/json - 使用JSON_UNESCAPED_UNICODE:避免中文转义
- 状态码规范:使用HTTP状态码 + 业务状态码
- 错误处理:捕获并处理JSON编码错误
- 安全考虑:避免输出敏感信息
这样的JSON返回方式既规范又安全,适合在PHP项目中使用。