当前位置:

首页 > 编程开发 > PHP数组转JSON格式方法详解

PHP数组转JSON格式方法详解

PhpStorm macOS版
PhpStorm macOS版

PhpStorm 是 JetBrains 推出的专业 PHP 集成开发环境,可在 Mac 上完成代码编写、智能检查、重构、调试、测试和数据库管理。它支持主流 PHP 框架、Composer、Git、Docker 与远程解释器。

立即下载
¥890
Mac 2026-10-13
数据库 编程开发 phpstorm 服务器管理 集成开发环境

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

本文目录

    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表示形式的字符串。

     '张三',
        '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返回的数据在某些环境下乱码,排查起来着实费了一番功夫。

    另一个不那么常见但可能很麻烦的问题是循环引用。如果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数据时更加高效、灵活和健壮。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 PHP JSON
    相关文章 更多
    php怎么连接数据库mysql完整代码与操作步骤
    php怎么连接数据库mysql完整代码与操作步骤

    详细介绍如何使用PHP PDO扩展连接MySQL数据库,包含完整的代码示例、DSN配置方法及异常处理技巧,帮助开发者快速建立稳定安全的数据库连接。

    PHP递归遍历目录文件:RecursiveDirectoryIterator与自定义实现
    PHP递归遍历目录文件:RecursiveDirectoryIterator与自定义实现

    深入解析在PHP中递归遍历多级目录文件的两种核心方案:基于SPL标准库的RecursiveDirectoryIterator高效流式迭代,与基于scandir/opendir的自定义递归函数实现,剖析执行机制、内存表现与实战避坑指南。

    解决PHP递归报错:max_nesting_level限制与内存溢出处理
    解决PHP递归报错:max_nesting_level限制与内存溢出处理

    遇到PHP递归报错时,不要盲目调大max_nesting_level。本文教你区分Xdebug限制、内存耗尽和正则递归错误,提供代码级的终止条件优化与迭代替代方案,彻底解决栈溢出问题。

    PHP递归中static变量与引用传递的常见陷阱及调试
    PHP递归中static变量与引用传递的常见陷阱及调试

    本文分析PHP递归中static变量导致的状态污染及引用传递引发的共享数据修改问题。提供具体的代码复现、缓存键设计建议及调试打印技巧,帮助开发者避免隐蔽的逻辑错误。

    PHP递归性能优化技巧与迭代替代方案
    PHP递归性能优化技巧与迭代替代方案

    解析PHP递归函数在树形数据处理中的性能瓶颈,提供预加载数据消除I/O、使用显式栈替代深层递归的实战方案,帮助开发者在代码可读性与执行效率间做出合理取舍。

    thinkphp项目部署指南详解服务器部署步骤
    thinkphp项目部署指南详解服务器部署步骤

    详细解析ThinkPHP项目在Linux服务器上的部署步骤,包括环境搭建、文件权限、Nginx配置及常见陷阱,提供可复制的代码示例与例外场景分析。

    PHP发送HTTP请求的方法及完整代码教程
    PHP发送HTTP请求的方法及完整代码教程

    详解PHP中发送HTTP请求的常用方法,包括原生cURL配置、file_get_contents流操作及Guzzle库的使用,提供GET/POST请求的完整代码示例与注意事项。

    Java发送post请求发送json数据的实现方法与代码示例
    Java发送post请求发送json数据的实现方法与代码示例

    深入解析Java发送JSON格式POST请求的实现机制,对比原生API与第三方库的代码差异,提供可复制的代码示例,并探讨超时设置、编码处理及微服务场景下的例外情况。

    php解析json内嵌json数据教程及取值方法
    php解析json内嵌json数据教程及取值方法

    本文详解PHP中json_decode处理嵌套JSON数据的机制,对比对象与数组模式的取值差异,提供防止空指针错误的健壮代码示例,帮助开发者快速定位解析失败原因。

    PHP 在 2026 年还适用吗?
    PHP 在 2026 年还适用吗?

    PHP在2026年仍适用于现代网站构建,在常规Web服务和内容密集型站点中较Python、Java等保持优势。其JIT编译优化性能,安全补丁及时,全面支持云原生,拥有成熟框架生态,整体成本较低。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?