本文目录导读:

在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项目中使用。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播