0

0

PHP如何将数组转换为JSON字符串_PHP数组与JSON格式相互转换的方法

下次还敢

下次还敢

发布时间:2025-09-16 21:41:01

|

501人浏览过

|

来源于php中文网

原创

PHP使用json_encode()将数组转为JSON字符串,json_decode()将JSON字符串解析为数组或对象;处理中文需添加JSON_UNESCAPED_UNICODE避免转义,JSON_PRETTY_PRINT可格式化输出;注意数据类型映射、错误检查、深度限制及大整数精度问题,确保安全与性能。

php如何将数组转换为json字符串_php数组与json格式相互转换的方法

PHP将数组转换为JSON字符串,主要依赖于内置的

json_encode()
函数;反之,将JSON字符串解析回PHP数组或对象,则使用
json_decode()
函数。这两个函数是PHP处理数据序列化和反序列化,尤其是与前端或其他API交互时的核心工具

解决方案

在PHP中,将数组转换为JSON字符串是一个非常直接的过程。你只需要调用

json_encode()
函数,并传入你的PHP数组即可。这个函数会返回一个JSON格式的字符串。如果转换失败,它会返回
false

 '张三',
    'age' => 30,
    'isStudent' => false,
    'hobbies' => ['reading', 'coding', 'travel'],
    'address' => [
        'city' => '北京',
        'zip' => '100000'
    ]
];

// 将数组转换为JSON字符串
// 这里使用了JSON_UNESCAPED_UNICODE来防止中文被转义,
// JSON_PRETTY_PRINT让输出更易读(调试时非常有用)
$jsonString = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

if ($jsonString === false) {
    echo "JSON编码失败: " . json_last_error_msg();
} else {
    echo "转换后的JSON字符串:\n";
    echo $jsonString;
}

echo "\n\n";

// 这是一个JSON字符串,通常从API响应或文件读取
$jsonInput = '{"product":"Laptop","price":1200.50,"specs":{"cpu":"i7","ram":"16GB"},"inStock":true}';

// 将JSON字符串转换为PHP数组
// 传入true作为第二个参数,会强制返回关联数组而不是对象
$decodedArray = json_decode($jsonInput, true);

if (json_last_error() !== JSON_ERROR_NONE) {
    echo "JSON解码失败: " . json_last_error_msg();
} else {
    echo "解码后的PHP数组:\n";
    print_r($decodedArray);
}

echo "\n\n";

// 如果不传入true,则会返回PHP对象
$decodedObject = json_decode($jsonInput);
echo "解码后的PHP对象:\n";
print_r($decodedObject);
?>

json_encode()
函数接受第二个参数,即一组位掩码选项,用于控制编码行为。我个人经常使用的包括:

  • JSON_UNESCAPED_UNICODE
    :这对于包含中文的字符串非常关键,它会阻止中文被转义成
    \uXXXX
    的形式,让JSON更易读且体积略小。
  • JSON_PRETTY_PRINT
    :在开发和调试阶段,这个选项能让JSON输出格式化,带有缩进和换行,看起来一目了然。生产环境中通常会移除,以减少传输体积。
  • JSON_NUMERIC_CHECK
    :尝试将数字字符串编码为JSON数字类型,而不是字符串。这有时会导致意想不到的行为,所以使用时需要谨慎。

json_decode()
函数同样接受第二个参数。当设置为
true
时,它会将JSON对象转换为PHP关联数组;如果省略或设置为
false
,则转换为PHP标准对象(
stdClass
)。第三个参数是
depth
,用于限制递归深度,防止解析恶意构造的深度嵌套JSON导致内存耗尽。第四个参数是
options
,比如
JSON_BIGINT_AS_STRING
,这在处理JavaScript无法精确表示的大整数时非常有用,可以避免数据精度丢失,直接将其作为字符串处理。

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

PHP数组转JSON时,如何避免中文乱码或转义问题,并优化输出格式?

处理中文时,最常见的“问题”就是

json_encode()
默认会将非ASCII字符转义成
\uXXXX
的形式。这并非乱码,而是JSON标准允许的表示方式,但对于人类阅读或者某些特定场景,我们可能希望看到原始的中文。解决这个问题非常简单,就是在调用
json_encode()
时,传入
JSON_UNESCAPED_UNICODE
选项。

 '你好,世界!',
    'description' => '这是一个包含中文的示例。',
    'items' => ['苹果', '香蕉', '橘子']
];

// 默认编码,中文会被转义
$defaultJson = json_encode($dataWithChinese);
echo "默认编码 (中文被转义):\n" . $defaultJson . "\n\n";
// 输出: {"title":"\u4f60\u597d\uff0c\u4e16\u754c\uff01","description":"\u8fd9\u662f\u4e00\u4e2a\u5305\u542b\u4e2d\u6587\u7684\u793a\u4f8b\u3002","items":["\u82f9\u679c","\u9999\u8549","\u6a58\u5b50"]}

// 使用 JSON_UNESCAPED_UNICODE 避免中文转义
$unescapedJson = json_encode($dataWithChinese, JSON_UNESCAPED_UNICODE);
echo "中文不转义:\n" . $unescapedJson . "\n\n";
// 输出: {"title":"你好,世界!","description":"这是一个包含中文的示例。","items":["苹果","香蕉","橘子"]}

// 结合 JSON_PRETTY_PRINT 优化输出格式
$prettyJson = json_encode($dataWithChinese, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo "中文不转义且格式化:\n" . $prettyJson . "\n";
/* 输出:
{
    "title": "你好,世界!",
    "description": "这是一个包含中文的示例。",
    "items": [
        "苹果",
        "香蕉",
        "橘子"
    ]
}
*/
?>

至于优化输出格式,

JSON_PRETTY_PRINT
就是你的最佳选择。它会为JSON字符串添加缩进和换行,使其在控制台或日志文件中更易读。当然,这会增加JSON字符串的体积,所以在生产环境中,如果对带宽或存储有严格要求,通常会选择不使用这个选项。

另一个需要注意的细节是,

json_encode()
要求输入的字符串是UTF-8编码。如果你的PHP数组中包含非UTF-8编码的字符串,
json_encode()
可能会返回
false
或者生成不正确的JSON。在这种情况下,你需要先使用
mb_convert_encoding()
等函数将字符串转换为UTF-8。编码问题往往是隐藏的坑,一旦遇到,排查起来会比较头疼。

PHP在处理不同数据类型与JSON之间的映射关系是怎样的?

PHP数组与JSON格式之间的转换,本质上是数据类型的一种映射。理解这种映射关系,对于避免数据丢失或格式错误至关重要。

PHP数据类型到JSON数据类型:

  • string
    (字符串)
    ->
    string
    (字符串)
    :这是最直接的映射。
  • int
    (整数)
    ,
    float
    (浮点数)
    ->
    number
    (数字)
    :PHP的整数和浮点数会直接转换为JSON的数字类型。
  • bool
    (布尔值)
    ->
    true
    false
    :PHP的
    true
    false
    会转换为JSON的布尔值。
  • null
    (空值)
    ->
    null
    (空值)
    :PHP的
    null
    会转换为JSON的
    null
  • array
    (索引数组)
    ->
    array
    (数组)
    :如果PHP数组的所有键都是连续的整数(从0开始),那么它会被编码为JSON数组。例如
    [0 => 'a', 1 => 'b']
    会变成
    ["a", "b"]
  • array
    (关联数组)
    ->
    object
    (对象)
    :如果PHP数组包含非连续的整数键,或者包含字符串键,它会被编码为JSON对象。例如
    ['key' => 'value', 'another' => 123]
    会变成
    {"key": "value", "another": 123}
  • object
    (对象)
    ->
    object
    (对象)
    :PHP对象(包括
    stdClass
    实例)会被编码为JSON对象。默认情况下,只有对象的公共(public)属性会被编码。如果需要自定义对象的序列化行为,对象可以实现
    JsonSerializable
    接口。
  • resource
    (资源)
    ,
    callable
    (可调用类型)
    等其他类型 ->
    null
    :这些PHP特有的数据类型在JSON中没有直接对应,通常会被编码为
    null

JSON数据类型到PHP数据类型:

Android数据格式解析对象JSON用法 WORD版
Android数据格式解析对象JSON用法 WORD版

本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载
  • string
    (字符串)
    ->
    string
    (字符串)
  • number
    (数字)
    ->
    int
    (整数)
    float
    (浮点数)
    :PHP会根据数值的大小和是否有小数部分自动判断。
  • true
    false
    ->
    bool
    (布尔值)
  • null
    (空值)
    ->
    null
    (空值)
  • array
    (数组)
    ->
    array
    (索引数组)
  • object
    (对象)
    ->
    stdClass
    (标准对象)
    array
    (关联数组)
    :这取决于
    json_decode()
    的第二个参数。如果为
    true
    ,则为关联数组;否则为
    stdClass
    对象。

理解这些映射关系,尤其是在处理数据库数据、API请求响应时非常重要。比如,一个纯数字的PHP索引数组,如果中间某个键不是连续的,或者变成了字符串,那么

json_encode
就会把它当作关联数组处理,最终在JSON中体现为对象,而不是数组。这在我以前的项目中,曾导致前端解析时出现类型错误。

 'Hello PHP',
    'int_val' => 123,
    'float_val' => 45.67,
    'bool_true' => true,
    'bool_false' => false,
    'null_val' => null,
    'indexed_array' => ['apple', 'banana', 'cherry'],
    'associative_array' => ['name' => 'Alice', 'age' => 25],
    'object_val' => (object)['id' => 101, 'status' => 'active'],
    // 'resource_val' => fopen('php://memory', 'r'), // 资源类型会被编码为 null
    'empty_array' => [],
    'empty_object' => new stdClass(),
    'mixed_keys_array' => [0 => 'first', 2 => 'third', 'key' => 'value'] // 会被编码为对象
];

$jsonOutput = json_encode($mixedData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo "混合数据类型编码为JSON:\n" . $jsonOutput . "\n\n";

// 解码回PHP
$decodedMixed = json_decode($jsonOutput, true); // 解码为关联数组
echo "JSON解码回PHP关联数组:\n";
print_r($decodedMixed);

$decodedObject = json_decode($jsonOutput); // 解码为对象
echo "\nJSON解码回PHP对象:\n";
print_r($decodedObject);
?>

从上面的例子可以看出,

mixed_keys_array
虽然在PHP中是数组,但因为它包含非连续整数键和字符串键,最终被
json_encode
处理成了JSON对象。这正是PHP数组转换为JSON对象的核心判断逻辑。

PHP解析JSON字符串时,如何处理潜在的数据安全问题和性能优化?

在接收和解析外部JSON数据时,数据安全和性能是两个不可忽视的方面。

数据安全方面:

  1. 输入验证与过滤: 永远不要信任来自外部的任何数据。在将JSON字符串传入

    json_decode()
    之前,如果JSON是用户输入的一部分,务必进行初步的字符串清理或验证。虽然
    json_decode()
    本身会处理格式不正确的JSON,但恶意构造的JSON字符串可能导致解析失败或消耗大量资源。

  2. 错误检查:

    json_decode()
    在解析失败时会返回
    null
    (或
    false
    ,取决于PHP版本和错误类型)。因此,在每次调用
    json_decode()
    之后,都应该立即检查其返回值,并结合
    json_last_error()
    json_last_error_msg()
    来判断是否发生了错误以及错误原因。这能有效防止程序在收到无效JSON时继续处理错误数据。

  3. 数据类型和结构验证: 即使JSON解析成功,也需要验证解码后的PHP数据结构和数据类型是否符合预期。例如,如果期望一个字段是整数,但在JSON中它是一个字符串,就可能导致后续业务逻辑出错。

  4. 深度限制:

    json_decode()
    的第三个参数
    depth
    可以限制JSON的嵌套深度。恶意用户可能会发送一个深度极高的JSON字符串,试图通过递归解析来耗尽服务器内存。设置一个合理的深度限制可以有效防御此类攻击。

性能优化方面:

  1. 避免不必要的转换: 在性能敏感的场景下,如果数据只是在PHP内部传递,并且不需要与外部系统(如前端JavaScript)交互,那么就没有必要频繁地在数组和JSON字符串之间进行转换。直接使用PHP数组或对象通常效率更高。
  2. 选择合适的解码方式:
    json_decode($jsonString, true)
    (解码为关联数组)通常比
    json_decode($jsonString)
    (解码为对象)在某些场景下性能略好,因为处理数组比处理对象可能更直接一些。但这种差异通常微乎其微,更重要的是根据业务需求选择最方便的数据结构。
  3. 处理大整数: JavaScript在处理大整数时存在精度问题(
    Number.MAX_SAFE_INTEGER
    )。如果JSON中包含超过此限制的整数,并且需要精确处理,
    json_decode()
    的第四个参数可以传入
    JSON_BIGINT_AS_STRING
    选项,将大整数解码为PHP字符串,避免精度丢失。
  4. 内存管理: 对于非常大的JSON字符串,
    json_decode()
    会一次性将整个JSON字符串加载到内存中并进行解析,这可能导致内存消耗过大。如果遇到这种情况,可能需要考虑使用流式解析器(如
    simps/json-rpc
    或自定义解析逻辑),但对于大多数Web应用场景,PHP内置的
    json_decode()
    已经足够高效。
  5. 缓存: 如果某些JSON数据是静态的或更新不频繁,可以考虑将其序列化后的JSON字符串缓存起来(例如使用Redis、Memcached或文件缓存),避免每次请求都重新生成或解析。

总的来说,安全和性能往往是相互关联的。一个安全的解析策略,通常也意味着对输入有更严格的检查,这在一定程度上可能会增加处理开销,但为了系统的稳定性和数据完整性,这些开销是值得的。在优化性能时,首先要确保代码的正确性和安全性,然后才考虑通过各种手段进行性能调优。

相关专题

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

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

2881

2023.09.01

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

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

1704

2023.10.11

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

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

1560

2023.10.11

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

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

1078

2023.10.23

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

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

1525

2023.10.23

html怎么上传
html怎么上传

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

1277

2023.11.03

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

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

1649

2023.11.09

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

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

1309

2023.11.13

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

45

2026.01.23

热门下载

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

精品课程

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

共137课时 | 9.3万人学习

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

共6课时 | 10.9万人学习

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

共13课时 | 0.9万人学习

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

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