0

0

php如何将数组转换为JSON?php数组与JSON格式相互转换

尼克

尼克

发布时间:2025-09-21 09:08:02

|

914人浏览过

|

来源于php中文网

原创

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

php如何将数组转换为json?php数组与json格式相互转换

PHP中将数组转换为JSON字符串,以及将JSON字符串转换回PHP数组或对象,主要依赖于两个内置函数:

json_encode()
json_decode()
。它们是PHP处理Web数据交换,尤其是与JavaScript前端交互时的核心工具,让不同数据格式之间的转换变得异常简单直接。

在PHP里,将数组转换成JSON字符串,或者反过来将接收到的JSON数据还原成PHP能识别的结构,这几乎是现代Web开发中每天都要面对的场景。

json_encode()
函数负责把PHP的数组或对象序列化成JSON格式的字符串,而
json_decode()
则负责解析JSON字符串,将其反序列化成PHP的数组或对象。

解决方案

将PHP数组转换为JSON字符串

使用

json_encode()
函数是核心。它接受一个PHP值(通常是数组或对象)作为参数,并返回其JSON表示形式的字符串。

立即学习PHP免费学习笔记(深入)”;

 '张三',
    '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字符串更易读,带缩进和换行。
  • JSON_UNESCAPED_UNICODE
    : 防止非ASCII字符(如中文)被转义成
    \uXXXX
    形式,保持原始字符。
  • JSON_UNESCAPED_SLASHES
    : 防止斜杠
    /
    被转义成
    \/
  • JSON_NUMERIC_CHECK
    : 将所有数字字符串编码为数字(如果它们是有效的数字)。

将JSON字符串转换为PHP数组或对象

使用

json_decode()
函数来解析JSON字符串。它接受JSON字符串作为第一个参数。

 张三
    [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时,有哪些常见的陷阱或需要注意的细节?

在日常开发中,将PHP数组或对象转换为JSON字符串看起来简单,但实际上有一些细节如果不注意,可能会导致意想不到的问题,尤其是在处理多语言、复杂数据类型或大数据量时。

一个常见的坑就是字符编码问题。默认情况下,

json_encode()
会将非ASCII字符(比如中文)转义成
\uXXXX
的形式。这在传输和存储上是没问题的,但如果你希望JSON字符串在日志、前端调试或某些场景下直接显示中文,那就需要用到
JSON_UNESCAPED_UNICODE
选项。我个人觉得,除非有明确的兼容性需求,否则带上这个选项会让JSON输出更直观。

接着是数据类型映射。PHP的

null
会直接映射为JSON的
null
;布尔值
true
/
false
映射为JSON的
true
/
false
;整数和浮点数直接映射。字符串就映射为JSON字符串。数组会根据其键是数字还是字符串,分别映射为JSON数组(
[...]
)或JSON对象(
{...}
)。如果PHP数组的键是混合的(既有数字又有字符串),
json_encode()
会将其视为关联数组,最终编码为JSON对象。这一点其实很重要,因为它决定了前端拿到数据后是按数组索引还是对象属性来访问。

还有就是非UTF-8字符

json_encode()
要求输入的字符串是UTF-8编码的。如果你的PHP字符串是其他编码(比如GBK),
json_encode()
可能会返回
false
或者生成不正确的JSON字符串。在这种情况下,你需要先用
mb_convert_encoding()
等函数将字符串转换为UTF-8。我曾因为遗漏这个细节,导致API返回的数据在某些环境下乱码,排查起来着实费了一番功夫。

宣小二
宣小二

宣小二:媒体发稿平台,自媒体发稿平台,短视频矩阵发布平台,基于AI驱动的企业自助式投放平台。

下载

另一个不那么常见但可能很麻烦的问题是循环引用。如果PHP对象之间存在循环引用(A引用B,B又引用A),

json_encode()
在尝试序列化时会陷入无限循环,最终导致失败并返回
false
。对于这种情况,你可能需要手动处理,比如实现
JsonSerializable
接口来控制序列化过程,或者在序列化前解除这些循环引用。

最后,当处理大数字时,虽然

json_encode()
会正确地将PHP的
int
string
类型的大数字编码为JSON数字,但前端JavaScript的
Number
类型有精度限制(最大安全整数是
2^53 - 1
)。如果你的数字超过这个范围,JavaScript解析后可能会丢失精度。这种情况下,一种常见的做法是在PHP端将大数字作为字符串编码到JSON中,让前端以字符串形式接收并处理。

如何确保JSON数据的安全性与有效性,尤其是在处理用户输入时?

在Web应用中,JSON数据往往是前端与后端交互的桥梁,其中涉及到用户输入的部分,安全性与有效性就变得尤为关键。我个人在处理这类问题时,会特别关注以下几个方面。

首先,输入验证是第一道防线。当从前端接收到JSON字符串时,即使你期望它是一个合法的JSON,也不能完全信任。在调用

json_decode()
之前,至少应该做一些基本的检查:它是不是一个字符串?长度是否合理?这些虽然不能保证JSON内容的合法性,但可以防止一些简单的攻击或无效输入导致的服务崩溃。更重要的是,
json_decode()
之后,你需要对解析出来的PHP数组或对象进行严格的数据校验。比如,某个字段是否必须存在?它的数据类型是否正确?值的范围是否符合预期?这通常会结合PHP的
filter_var()
、自定义验证规则或像Laravel那样的验证器来完成。

其次,错误处理机制不可或缺

json_decode()
在解析失败时会返回
null
(或者在某些情况下是
false
),并且设置
json_last_error()
json_last_error_msg()
。我强烈建议每次调用
json_decode()
后都检查这两个函数,以便及时发现并记录解析错误。这不仅有助于调试,也能让你的应用在面对恶意或格式错误的JSON输入时,能够优雅地失败,而不是抛出难以理解的错误信息。

再者,输出过滤在某些特定场景下也需要考虑。如果你的PHP代码将

json_encode()
生成的JSON字符串直接嵌入到HTML页面中(例如,通过
script
标签将数据传递给JavaScript),那么你必须使用
htmlspecialchars()
或其他适当的过滤函数来转义特殊字符,以防止跨站脚本(XSS)攻击。虽然JSON本身是安全的,但将其嵌入到不安全的环境中就可能引入风险。

最后,数据结构的一致性也是有效性的重要组成部分。前后端应该就JSON数据的结构达成一致的“契约”。这意味着每个字段的名称、类型、是否可选等都应该明确。当接收到不符合预期的JSON结构时,后端应该能够识别并拒绝处理,而不是尝试“猜测”或默默地忽略。这有助于减少前后端之间的沟通成本,并提高系统的健壮性。

除了基本的数组到JSON转换,PHP还有哪些高级用法或第三方库可以提升开发效率?

除了

json_encode
json_decode
这两个基础函数,PHP在处理JSON方面还有一些高级特性和第三方库,它们能显著提升开发效率,尤其是在构建复杂的API或处理特定需求时。

一个非常实用的高级特性是

JsonSerializable
接口。当你的PHP对象需要被
json_encode()
序列化时,如果这个对象实现了
JsonSerializable
接口,那么
json_encode()
就不会直接序列化对象的公共属性,而是会调用该对象实现的
jsonSerialize()
方法。这个方法返回的值(可以是数组或任何可序列化的类型)才是最终被编码成JSON的内容。这给了你极大的灵活性,可以自定义对象的JSON表示形式,比如隐藏敏感属性、重命名属性或格式化特定数据。

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、XML、YAML等),可以根据不同的上下文(如管理员视图、公开API)灵活地选择要暴露的字段、处理对象关系(嵌套、扁平化),甚至进行数据转换。使用它们,你可以用声明式的方式定义数据如何被序列化,大大减少了手动编写转换逻辑的工作量,并确保了API响应的一致性。

对于处理超大JSON文件或流式数据,如果一次性将整个JSON字符串加载到内存中会导致内存溢出,那么传统的

json_decode()
就不适用了。这时,可以考虑使用一些专门的流式JSON解析库,例如
halaxa/json-machine
。这些库允许你逐行或逐块地解析JSON,而无需将整个文件读入内存,这对于处理日志文件、大数据导入导出等场景非常有用。

总的来说,虽然

json_encode()
json_decode()
是PHP处理JSON的基石,但了解并善用
JsonSerializable
接口,以及在合适的场景引入成熟的序列化组件或流式解析库,能够让你的PHP应用在处理JSON数据时更加高效、灵活和健壮。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2698

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1665

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1527

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

974

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1443

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1235

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1509

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 8.5万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号