PHP处理JSON依赖json_encode()和json_decode()函数,前者将PHP数组或对象转为JSON字符串,后者将JSON字符串解析为PHP数据。使用时需注意编码必须为UTF-8、数组键的类型影响输出结构、对象私有属性不被序列化、避免循环引用及资源类型无法编码等问题。推荐始终检查json_last_error(),合理使用JSON_PRETTY_PRINT和JSON_UNESCAPED_UNICODE选项,对复杂对象实现JsonSerializable接口以控制序列化内容。接收外部JSON时,应验证格式有效性,结合JSON Schema进行结构校验,清洗数据并防范安全风险如XSS或DoS攻击。开发中可借助Guzzle等HTTP库简化JSON请求处理,或利用Laravel、Symfony等框架的内置JSON支持提升效率。

PHP处理JSON数据主要依赖其内置的
json_encode()
json_decode()
json_encode()
json_decode()
在我看来,掌握
json_encode
json_decode
json_encode()
当你需要将PHP中的数据发送到前端JavaScript、另一个API服务,或者写入一个JSON文件时,
json_encode()
立即学习“PHP免费学习笔记(深入)”;
<?php
$data = [
'name' => '张三',
'age' => 30,
'isStudent' => false,
'courses' => ['PHP', 'JavaScript', 'SQL'],
'address' => (object)[ // 也可以直接定义为对象
'city' => '北京',
'zip' => '100000'
]
];
// 基本转换
$jsonString = json_encode($data);
echo "基本JSON字符串:\n" . $jsonString . "\n\n";
// 加入选项,例如:美化输出和不转义Unicode字符
$prettyJsonString = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "美化且不转义的JSON字符串:\n" . $prettyJsonString . "\n\n";
// 错误检查(很重要!)
if (json_last_error() !== JSON_ERROR_NONE) {
echo "json_encode 错误: " . json_last_error_msg() . "\n";
}
?>这里,
JSON_PRETTY_PRINT
JSON_UNESCAPED_UNICODE
\uXXXX
json_decode()
当你的PHP应用接收到一个JSON字符串(比如从API响应、POST请求体或配置文件中),你需要用
json_decode()
<?php
$jsonStringFromApi = '{"name":"李四","age":25,"skills":["Python","Vue"],"isActive":true}';
// 默认转换为 stdClass 对象
$objectData = json_decode($jsonStringFromApi);
echo "解码为对象:\n";
var_dump($objectData);
echo "\n";
echo "访问属性: " . $objectData->name . ", 技能: " . $objectData->skills[0] . "\n\n";
// 转换为关联数组 (第二个参数设为 true)
$arrayData = json_decode($jsonStringFromApi, true);
echo "解码为关联数组:\n";
var_dump($arrayData);
echo "\n";
echo "访问元素: " . $arrayData['name'] . ", 技能: " . $arrayData['skills'][0] . "\n\n";
// 错误检查
$invalidJson = '{"name":"王五","age":}'; // 这是一个无效的JSON
$invalidDecode = json_decode($invalidJson);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "json_decode 错误: " . json_last_error_msg() . "\n";
}
?>我个人更倾向于使用
json_decode($jsonString, true)
在实际开发中,我发现将PHP的复杂数据结构转换为JSON并非总是那么一帆风顺,总会遇到一些让人头疼的小问题。这里我总结了一些常见的陷阱和一些经过实践检验的最佳实践。
常见陷阱:
json_encode()
null
mb_convert_encoding($string, 'UTF-8', '原编码')
json_encode()
[0 => 'a', 1 => 'b']
['a', 'b']
{"0": "a", "1": "b"}json_encode()
protected
private
JsonSerializable
json_encode()
json_encode()
Closure
最佳实践:
始终进行错误检查: 编码或解码后,务必使用
json_last_error()
json_last_error_msg()
null
使用JSON_UNESCAPED_UNICODE
JSON_PRETTY_PRINT
JSON_PRETTY_PRINT
实现JsonSerializable
JsonSerializable
jsonSerialize()
class User implements JsonSerializable {
private $id;
public $name;
protected $passwordHash; // 不希望被序列化
public function __construct($id, $name, $passwordHash) {
$this->id = $id;
$this->name = $name;
$this->passwordHash = $passwordHash;
}
public function jsonSerialize(): mixed {
// 只暴露公共属性和经过处理的私有属性
return [
'id' => $this->id,
'username' => $this->name, // 转换为 username 键
// 'password_hash' => $this->passwordHash // 不暴露密码哈希
];
}
}
$user = new User(1, 'Alice', 'hashed_password_123');
echo json_encode($user, JSON_PRETTY_PRINT);
// 输出将只包含 id 和 username数据清洗与验证: 在编码之前,对数据进行一次清洗和验证,确保所有的数据类型和值都符合预期,可以避免很多不必要的错误。
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
性能考量: 对于非常大的数据集,
json_encode()
接收外部JSON数据,尤其是在处理API请求或用户上传的内容时,安全性与有效性是必须优先考虑的。我曾见过一些系统因为对传入JSON缺乏严格校验而导致各种问题,从数据格式错误到更严重的安全漏洞。
确保有效性:
检查json_decode()
json_decode()
null
json_last_error()
JSON_ERROR_NONE
$inputJson = file_get_contents('php://input'); // 假设从请求体获取
$data = json_decode($inputJson, true);
if (json_last_error() !== JSON_ERROR_NONE) {
// JSON格式错误,可能是空字符串,或者格式不规范
http_response_code(400); // Bad Request
echo json_encode(['error' => 'Invalid JSON format: ' . json_last_error_msg()]);
exit;
}
// 此时 $data 已经是一个有效的PHP数组或对象进行结构和类型验证: 即使JSON格式本身是有效的,其内部的数据结构和每个字段的类型也可能不符合你的预期。
手动检查: 对关键字段使用
isset()
is_array()
is_string()
is_numeric()
if (!isset($data['userId']) || !is_numeric($data['userId'])) {
// userId 字段缺失或类型不正确
http_response_code(400);
echo json_encode(['error' => 'Missing or invalid userId']);
exit;
}
// ... 对其他字段进行类似检查使用JSON Schema验证库: 对于复杂的JSON结构,手动检查会变得非常繁琐且容易出错。推荐使用专门的JSON Schema验证库,如
justinrainbow/json-schema
// 示例:使用 json-schema 库
// composer require justinrainbow/json-schema
use JsonSchema\Validator;
$schema = json_decode('{
"type": "object",
"properties": {
"name": {"type": "string", "minLength": 1},
"age": {"type": "integer", "minimum": 0},
"email": {"type": "string", "format": "email"}
},
"required": ["name", "age", "email"]
}');
$validator = new Validator();
$validator->validate($data, $schema);
if (!$validator->isValid()) {
http_response_code(400);
$errors = [];
foreach ($validator->getErrors() as $error) {
$errors[] = sprintf("[%s] %s", $error['property'], $error['message']);
}
echo json_encode(['error' => 'Validation failed', 'details' => $errors]);
exit;
}
// 数据通过了 schema 验证数据净化(Sanitization): 即使数据通过了验证,你也不能完全信任它。在将JSON中的数据用于数据库查询、HTML输出或文件系统操作之前,必须进行适当的净化。
prepare()
htmlspecialchars()
htmlentities()
确保安全性:
client_max_body_size
LimitRequestBody
php.ini
post_max_size
upload_max_filesize
json_decode
eval()
仅仅停留在
json_encode
json_decode
JsonSerializable
JsonSerializable
DateTime
stdClass
json_decode
stdClass
true
stdClass
$obj->prop
$arr['prop']
array_map
array_filter
JSON Schema验证库: 前面也提到了
justinrainbow/json-schema
HTTP客户端库的JSON集成: 现代的PHP HTTP客户端库,如Guzzle或Symfony HttpClient,通常都内置了对JSON的良好支持。
json_encode
Content-Type
application/json
// Guzzle 示例
$client = new GuzzleHttp\Client();
$response = $client->post('https://api.example.com/data', [
'json' => ['key' => 'value', 'id' => 123] // Guzzle会自动编码并设置Content-Type
]);json_decode
$data = $response->json(); // Guzzle会自动解码 // 或者 Symfony HttpClient $data = $response->toArray();
这些库极大地简化了与JSON API的交互,让你能更专注于业务逻辑,而不是底层的数据格式转换。
框架层面的JSON处理抽象: 主流的PHP框架(如Laravel、Symfony)在处理JSON方面做得非常出色。
Content-Type
application/json
// Laravel 示例
public function store(Request $request)
{
$name = $request->input('name'); // 如果是JSON,会自动从JSON体中获取
// ...
}json_encode
// Laravel 示例 return response()->json(['status' => 'success', 'data' => $result]); // Symfony 示例 return new JsonResponse(['status' => 'success', 'data' => $result]);
这些抽象层使得在框架中处理JSON变得非常流畅和自然,大大提升了开发效率。
总的来说,虽然
json_encode
json_decode
JsonSerializable
以上就是PHP如何处理JSON数据?使用json_encode和json_decode解析的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号