PHP中通过json_encode()将数组转为JSON字符串,json_decode()将JSON字符串转为数组或对象;需注意字符编码、数据类型映射、循环引用及大数精度问题,并结合JsonSerializable接口或序列化组件提升处理复杂数据的效率与安全性。

PHP中将数组转换为JSON字符串,以及将JSON字符串转换回PHP数组或对象,主要依赖于两个内置函数:
json_encode()
json_decode()
在PHP里,将数组转换成JSON字符串,或者反过来将接收到的JSON数据还原成PHP能识别的结构,这几乎是现代Web开发中每天都要面对的场景。
json_encode()
json_decode()
解决方案
使用
json_encode()
立即学习“PHP免费学习笔记(深入)”;
<?php
$data = [
'name' => '张三',
'age' => 30,
'isStudent' => false,
'hobbies' => ['coding', 'reading', 'travel'],
'address' => [
'city' => '北京',
'zip' => '100000'
],
'emptyValue' => null
];
// 基本转换
$jsonString = json_encode($data);
echo "基本JSON字符串:\n" . $jsonString . "\n\n";
// 输出: {"name":"\u5f20\u4e09","age":30,"isStudent":false,"hobbies":["coding","reading","travel"],"address":{"city":"\u5317\u4eac","zip":"100000"},"emptyValue":null}
// 格式化输出,并避免Unicode转义
$prettyJsonString = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
echo "格式化且不转义的JSON字符串:\n" . $prettyJsonString . "\n";
/* 输出:
格式化且不转义的JSON字符串:
{
"name": "张三",
"age": 30,
"isStudent": false,
"hobbies": [
"coding",
"reading",
"travel"
],
"address": {
"city": "北京",
"zip": "100000"
},
"emptyValue": null
}
*/
?>json_encode()
JSON_PRETTY_PRINT
JSON_UNESCAPED_UNICODE
\uXXXX
JSON_UNESCAPED_SLASHES
/
\/
JSON_NUMERIC_CHECK
使用
json_decode()
<?php
$jsonString = '{"name":"张三","age":30,"isStudent":false,"hobbies":["coding","reading","travel"],"address":{"city":"北京","zip":"100000"},"emptyValue":null}';
// 转换为PHP对象
$objectData = json_decode($jsonString);
echo "转换为PHP对象:\n";
print_r($objectData);
/* 输出:
转换为PHP对象:
stdClass Object
(
[name] => 张三
[age] => 30
[isStudent] =>
[hobbies] => Array
(
[0] => coding
[1] => reading
[2] => travel
)
[address] => stdClass Object
(
[city] => 北京
[zip] => 100000
)
[emptyValue] =>
)
*/
// 转换为PHP关联数组
$arrayData = json_decode($jsonString, true); // 第二个参数设为true
echo "\n转换为PHP关联数组:\n";
print_r($arrayData);
/* 输出:
转换为PHP关联数组:
Array
(
[name] => 张三
[age] => 30
[isStudent] =>
[hobbies] => Array
(
[0] => coding
[1] => reading
[2] => travel
)
[address] => Array
(
[city] => 北京
[zip] => 100000
)
[emptyValue] =>
)
*/
// 处理无效JSON
$invalidJson = '{"name":"张三", "age":}'; // 语法错误
$decodedInvalid = json_decode($invalidJson);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "\nJSON解析错误: " . json_last_error_msg() . "\n";
}
// 输出: JSON解析错误: Syntax error
?>json_decode()
assoc
true
false
stdClass
解析JSON后,务必检查
json_last_error()
json_last_error_msg()
在日常开发中,将PHP数组或对象转换为JSON字符串看起来简单,但实际上有一些细节如果不注意,可能会导致意想不到的问题,尤其是在处理多语言、复杂数据类型或大数据量时。
一个常见的坑就是字符编码问题。默认情况下,
json_encode()
\uXXXX
JSON_UNESCAPED_UNICODE
接着是数据类型映射。PHP的
null
null
true
false
true
false
[...]
{...}json_encode()
还有就是非UTF-8字符。
json_encode()
json_encode()
false
mb_convert_encoding()
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
另一个不那么常见但可能很麻烦的问题是循环引用。如果PHP对象之间存在循环引用(A引用B,B又引用A),
json_encode()
false
JsonSerializable
最后,当处理大数字时,虽然
json_encode()
int
string
Number
2^53 - 1
在Web应用中,JSON数据往往是前端与后端交互的桥梁,其中涉及到用户输入的部分,安全性与有效性就变得尤为关键。我个人在处理这类问题时,会特别关注以下几个方面。
首先,输入验证是第一道防线。当从前端接收到JSON字符串时,即使你期望它是一个合法的JSON,也不能完全信任。在调用
json_decode()
json_decode()
filter_var()
其次,错误处理机制不可或缺。
json_decode()
null
false
json_last_error()
json_last_error_msg()
json_decode()
再者,输出过滤在某些特定场景下也需要考虑。如果你的PHP代码将
json_encode()
script
htmlspecialchars()
最后,数据结构的一致性也是有效性的重要组成部分。前后端应该就JSON数据的结构达成一致的“契约”。这意味着每个字段的名称、类型、是否可选等都应该明确。当接收到不符合预期的JSON结构时,后端应该能够识别并拒绝处理,而不是尝试“猜测”或默默地忽略。这有助于减少前后端之间的沟通成本,并提高系统的健壮性。
除了
json_encode
json_decode
一个非常实用的高级特性是JsonSerializable
json_encode()
JsonSerializable
json_encode()
jsonSerialize()
<?php
class User implements JsonSerializable {
private $id;
private $name;
private $email; // 假设这是敏感信息
public function __construct($id, $name, $email) {
$this->id = $id;
$this->name = $name;
$this->email = $email;
}
public function jsonSerialize(): array {
// 只暴露id和name,隐藏email
return [
'userId' => $this->id,
'userName' => $this->name
];
}
}
$user = new User(1, '王五', 'wangwu@example.com');
$jsonUser = json_encode($user, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
echo "自定义序列化的用户对象:\n" . $jsonUser . "\n";
/* 输出:
自定义序列化的用户对象:
{
"userId": 1,
"userName": "王五"
}
*/
?>在更大型的项目中,尤其是在使用框架如Symfony或Laravel时,序列化组件(如Symfony Serializer Component或Laravel API Resources)是提升效率的利器。这些工具提供了更强大的对象序列化和反序列化功能,远超
json_encode
json_decode
对于处理超大JSON文件或流式数据,如果一次性将整个JSON字符串加载到内存中会导致内存溢出,那么传统的
json_decode()
halaxa/json-machine
总的来说,虽然
json_encode()
json_decode()
JsonSerializable
以上就是php如何将数组转换为JSON?php数组与JSON格式相互转换的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号