最核心方法是使用json_encode()函数将PHP数组转为JSON字符串,需确保数据为UTF-8编码、避免资源类型和循环引用,并通过json_last_error()检查错误;处理中文时应使用JSON_UNESCAPED_UNICODE选项;反向转换则用json_decode()并验证返回值与数据结构。

PHP中将数组转换为JSON,最核心且直接的方法是使用内置的
json_encode()
要将PHP数组转换为JSON,你只需要调用
json_encode()
<?php
$data = [
'name' => '张三',
'age' => 30,
'isStudent' => false,
'courses' => ['PHP', 'JavaScript', 'SQL'],
'details' => [
'city' => '北京',
'occupation' => '开发者'
]
];
$json_string = json_encode($data);
if ($json_string === false) {
echo "JSON 编码失败!错误信息:" . json_last_error_msg();
} else {
echo $json_string;
}
// 预期输出(如果未指定JSON_UNESCAPED_UNICODE):
// {"name":"\u5f20\u4e09","age":30,"isStudent":false,"courses":["PHP","JavaScript","SQL"],"details":{"city":"\u5317\u4eac","occupation":"\u5f00\u53d1\u8005"}}
// 如果指定了JSON_UNESCAPED_UNICODE:
// {"name":"张三","age":30,"isStudent":false,"courses":["PHP","JavaScript","SQL"],"details":{"city":"北京","occupation":"开发者"}}
?>json_encode()
false
json_last_error()
json_last_error_msg()
json_encode()
false
这事儿挺有意思的,
json_encode()
false
立即学习“PHP免费学习笔记(深入)”;
最常见的原因,我总结下来大概有这么几点:
非UTF-8编码的字符串:JSON标准要求字符串必须是UTF-8编码。如果你的PHP数组中包含了其他编码(比如GBK或ISO-8859-1)的字符串,
json_encode()
false
json_encode()
mb_convert_encoding()
iconv()
$non_utf8_string = mb_convert_encoding('你好,世界!', 'GBK', 'UTF-8'); // 假设这是一个GBK字符串
$data_with_bad_encoding = ['message' => $non_utf8_string];
$result = json_encode($data_with_bad_encoding); // 这可能会返回 false
// 正确的做法
$data_fixed_encoding = ['message' => mb_convert_encoding($non_utf8_string, 'UTF-8', 'GBK')];
// 或者更直接地,确保源头就是UTF-8
$result_fixed = json_encode($data_fixed_encoding);不可序列化的数据类型:JSON只支持有限的数据类型:字符串、数字、布尔值、
null
JsonSerializable
json_encode()
JsonSerializable
循环引用(Recursion):当你的数组或对象中存在循环引用,比如A引用B,B又引用A,
json_encode()
编码深度过大:PHP的
json_encode()
json_encode($data, $options, $depth)
内存不足:当处理非常庞大的数组时,生成JSON字符串可能会消耗大量内存,如果超出PHP的内存限制,也会导致失败。
memory_limit
无论哪种情况,记住,
json_last_error()
json_last_error_msg()
<?php
$resource = fopen('php://temp', 'r');
$data_with_resource = ['id' => 1, 'file_handle' => $resource];
$json_string = json_encode($data_with_resource);
if ($json_string === false) {
echo "JSON 编码失败!错误代码: " . json_last_error() . ", 错误信息: " . json_last_error_msg() . "\n";
} else {
echo $json_string;
}
fclose($resource); // 记得关闭资源
// 预期输出:JSON 编码失败!错误代码: 7, 错误信息: Type is not supported
?>这个例子就清楚地展示了资源类型无法编码的情况。
中文字符乱码,这简直是PHP开发者在处理JSON时最常遇到的“拦路虎”之一。我个人觉得,这主要源于对字符编码理解不够深入,以及对
json_encode()
json_encode()
\uXXXX
<?php
$data = ['message' => '你好,世界!'];
$json_default = json_encode($data);
echo "默认编码结果: " . $json_default . "\n";
// 默认编码结果: {"message":"\u4f60\u597d\uff0c\u4e16\u754c\uff01"}
?>你看,
\u4f60\u597d
为了让中文字符在JSON中直接显示,提高可读性,我们需要使用
json_encode()
options
JSON_UNESCAPED_UNICODE
<?php
$data = ['message' => '你好,世界!'];
$json_unescaped = json_encode($data, JSON_UNESCAPED_UNICODE);
echo "使用 JSON_UNESCAPED_UNICODE: " . $json_unescaped . "\n";
// 使用 JSON_UNESCAPED_UNICODE: {"message":"你好,世界!"}
?>这样一来,中文字符就直接显示了,是不是舒服多了?
但是,这里有一个非常重要的前提:你的PHP脚本、你的数据源(比如数据库)、以及传递给
json_encode()
JSON_UNESCAPED_UNICODE
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
json_encode()
false
false
所以,解决中文乱码的根本之道是:全程UTF-8。
SET NAMES utf8mb4;
Content-Type
header('Content-Type: application/json; charset=utf-8');做到了这些,再配合
JSON_UNESCAPED_UNICODE
json_encode()
options
json_encode()
options
JSON_UNESCAPED_UNICODE
JSON_PRETTY_PRINT
$data = ['id' => 1, 'name' => '产品A', 'price' => 99.99];
echo json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
/*
输出:
{
"id": 1,
"name": "产品A",
"price": 99.99
}
*/这个选项在开发阶段简直是神器,一眼就能看出JSON结构,不用再借助外部工具格式化。
JSON_NUMERIC_CHECK
"123"
$data = ['id' => '123', 'amount' => '45.67', 'code' => 'ABC'];
echo json_encode($data);
// {"id":"123","amount":"45.67","code":"ABC"} - 都是字符串echo json_encode($data, JSON_NUMERIC_CHECK); // {"id":123,"amount":45.67,"code":"ABC"} - 数字型字符串变成了数字
这在前后端接口对接时非常有用,可以避免前端拿到数字字符串后还需要手动转换的麻烦。
JSON_FORCE_OBJECT
{}[]
$empty_array = []; $indexed_array = ['apple', 'banana'];
echo "默认空数组: " . json_encode($empty_array) . "\n"; // 默认空数组: []
echo "默认索引数组: " . json_encode($indexed_array) . "\n"; // 默认索引数组: ["apple","banana"]
echo "强制对象空数组: " . json_encode($empty_array, JSON_FORCE_OBJECT) . "\n"; // 强制对象空数组: {}
echo "强制对象索引数组: " . json_encode($indexed_array, JSON_FORCE_OBJECT) . "\n"; // 强制对象索引数组: {"0":"apple","1":"banana"}
这个选项用得不多,但遇到特定需求时,它能帮你省去一些手动转换的逻辑。
JSON_UNESCAPED_SLASHES
/
json_encode()
/
\/
$data = ['url' => 'https://www.php.cn/link/c1481a88d8e582ce58f9413d5ac93360'];
echo "默认斜杠转义: " . json_encode($data) . "\n";
// 默认斜杠转义: {"url":"http:\/\/example.com\/path\/to\/resource"}echo "不转义斜杠: " . json_encode($data, JSON_UNESCAPED_SLASHES) . "\n"; // 不转义斜杠: {"url":"https://www.php.cn/link/c1481a88d8e582ce58f9413d5ac93360"}
这个选项在处理包含大量URL的JSON时,能让输出更简洁。
这些选项可以组合使用,用位运算符
|
JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE
把JSON字符串转换回PHP数组,这个过程叫做反序列化或解码,主要用到的是
json_decode()
json_encode()
json_decode()
$json
$associative
true
false
stdClass
我个人习惯是,绝大多数情况下都把
$associative
true
<?php
$json_string = '{"name":"张三","age":30,"isStudent":false,"courses":["PHP","JavaScript"],"details":{"city":"北京"}}';
// 转换为PHP对象(默认行为)
$php_object = json_decode($json_string);
echo "转换为PHP对象:\n";
print_r($php_object);
// 输出:
// stdClass Object
// (
// [name] => 张三
// [age] => 30
// [isStudent] =>
// [courses] => Array
// (
// [0] => PHP
// [1] => JavaScript
// )
// [details] => stdClass Object
// (
// [city] => 北京
// )
// )
// 转换为PHP关联数组
$php_array = json_decode($json_string, true);
echo "\n转换为PHP关联数组:\n";
print_r($php_array);
// 输出:
// Array
// (
// [name] => 张三
// [age] => 30
// [isStudent] =>
// [courses] => Array
// (
// [0] => PHP
// [1] => JavaScript
// )
// [details] => Array
// (
// [city] => 北京
// )
// )
?>关于“安全地”转换:
这里的“安全”主要指的是错误处理和输入验证。因为你收到的JSON字符串可能来自外部,它可能是无效的、恶意的,或者只是格式不正确。
检查json_decode()
json_decode()
null
$invalid_json = '{"name":"John", "age":30, }'; // 错误的JSON格式
$result = json_decode($invalid_json, true);
if ($result === null) {
echo "JSON 解码失败!错误代码: " . json_last_error() . ", 错误信息: " . json_last_error_msg() . "\n";
} else {
print_r($result);
}
// 预期输出:JSON 解码失败!错误代码: 4, 错误信息: Syntax error和
json_encode()
json_last_error()
json_last_error_msg()
验证解码后的数据结构: 即使
json_decode()
id
isset()
is_array()
is_numeric()
$user_data_json = '{"user_id":"abc", "username":"test"}'; // user_id 应该是数字
$user_data = json_decode($user_data_json, true);
if ($user_data !== null && isset($user_data['user_id']) && is_numeric($user_data['user_id'])) {
$user_id = (int)$user_data['user_id'];
echo "用户ID: " . $user_id . "\n";
} else {
echo "无效的用户数据或用户ID格式不正确。\n";
}我个人觉得,这一步是很多新手容易忽略的,但却是防御性编程中不可或缺的一环。你永远不知道外部输入会是什么妖魔鬼怪,所以做好验证是保护自己的关键。
通过结合
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号