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

尼克
发布: 2025-09-21 09:08:02
原创
899人浏览过
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免费学习笔记(深入)”;

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

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

使用

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

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

在日常开发中,将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返回的数据在某些环境下乱码,排查起来着实费了一番功夫。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online

另一个不那么常见但可能很麻烦的问题是循环引用。如果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表示形式,比如隐藏敏感属性、重命名属性或格式化特定数据。

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

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

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

总的来说,虽然

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

以上就是php如何将数组转换为JSON?php数组与JSON格式相互转换的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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