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

PHP将数组转换为JSON字符串,主要依赖于内置的
json_encode()
json_decode()
在PHP中,将数组转换为JSON字符串是一个非常直接的过程。你只需要调用
json_encode()
false
<?php
// 一个简单的PHP关联数组
$data = [
'name' => '张三',
'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_PRETTY_PRINT
JSON_NUMERIC_CHECK
json_decode()
true
false
stdClass
depth
options
JSON_BIGINT_AS_STRING
立即学习“PHP免费学习笔记(深入)”;
处理中文时,最常见的“问题”就是
json_encode()
\uXXXX
json_encode()
JSON_UNESCAPED_UNICODE
<?php
$dataWithChinese = [
'title' => '你好,世界!',
'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_encode()
json_encode()
false
mb_convert_encoding()
PHP数组与JSON格式之间的转换,本质上是数据类型的一种映射。理解这种映射关系,对于避免数据丢失或格式错误至关重要。
PHP数据类型到JSON数据类型:
string
string
int
float
number
bool
true
false
true
false
null
null
null
null
array
array
[0 => 'a', 1 => 'b']
["a", "b"]
array
object
['key' => 'value', 'another' => 123]
{"key": "value", "another": 123}object
object
stdClass
JsonSerializable
resource
callable
null
null
JSON数据类型到PHP数据类型:
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
string
string
number
int
float
true
false
bool
null
null
array
array
object
stdClass
array
json_decode()
true
stdClass
理解这些映射关系,尤其是在处理数据库数据、API请求响应时非常重要。比如,一个纯数字的PHP索引数组,如果中间某个键不是连续的,或者变成了字符串,那么
json_encode
<?php
// 各种数据类型的映射示例
$mixedData = [
'string_val' => '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
json_encode
在接收和解析外部JSON数据时,数据安全和性能是两个不可忽视的方面。
数据安全方面:
输入验证与过滤: 永远不要信任来自外部的任何数据。在将JSON字符串传入
json_decode()
json_decode()
错误检查:
json_decode()
null
false
json_decode()
json_last_error()
json_last_error_msg()
<?php
$malformedJson = '{"name":"John", "age":30, "city":"New York"'; // 缺少右大括号
$data = json_decode($malformedJson, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "JSON解析失败!错误信息: " . json_last_error_msg() . "\n";
// 根据错误类型进行处理,比如记录日志、返回错误响应等
} else {
// 安全地处理数据
print_r($data);
}
?>数据类型和结构验证: 即使JSON解析成功,也需要验证解码后的PHP数据结构和数据类型是否符合预期。例如,如果期望一个字段是整数,但在JSON中它是一个字符串,就可能导致后续业务逻辑出错。
深度限制:
json_decode()
depth
性能优化方面:
json_decode($jsonString, true)
json_decode($jsonString)
Number.MAX_SAFE_INTEGER
json_decode()
JSON_BIGINT_AS_STRING
json_decode()
simps/json-rpc
json_decode()
总的来说,安全和性能往往是相互关联的。一个安全的解析策略,通常也意味着对输入有更严格的检查,这在一定程度上可能会增加处理开销,但为了系统的稳定性和数据完整性,这些开销是值得的。在优化性能时,首先要确保代码的正确性和安全性,然后才考虑通过各种手段进行性能调优。
以上就是PHP如何将数组转换为JSON字符串_PHP数组与JSON格式相互转换的方法的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号