json_encode用于将PHP数组或对象转换为JSON字符串,支持通过JSON_UNESCAPED_UNICODE和JSON_PRETTY_PRINT等选项处理中文转义和格式化输出,需注意资源类型、循环引用、不可序列化对象及NaN/Infinity等特殊值会导致编码失败,可借助json_last_error()排查问题。

json_encode
json_encode
<?php
$data = [
'name' => '张三',
'age' => 30,
'isStudent' => false,
'courses' => ['PHP', 'JavaScript', 'SQL'],
'address' => null
];
$jsonString = json_encode($data);
echo $jsonString;
// 输出: {"name":"\u5f20\u4e09","age":30,"isStudent":false,"courses":["PHP","JavaScript","SQL"],"address":null}
?>你会发现上面的中文“张三”被转义了,这是
json_encode
$options
json_encode
比如,如果你想让中文不被转义,或者让输出的 JSON 字符串更易读,就得加上相应的选项:
立即学习“PHP免费学习笔记(深入)”;
<?php
$data = [
'name' => '李四',
'age' => 25,
'city' => '北京'
];
// 中文不转义,并且格式化输出
$jsonStringPretty = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
echo $jsonStringPretty;
/*
输出:
{
"name": "李四",
"age": 25,
"city": "北京"
}
*/
?>这里
JSON_UNESCAPED_UNICODE
\uXXXX
JSON_PRETTY_PRINT
json_encode
这个问题简直是
json_encode
\uXXXX
json_encode
但对于我们中文开发者来说,这种转义在很多场景下显得多余,甚至会增加调试的难度。解决办法非常简单,只需要在调用
json_encode
$options
JSON_UNESCAPED_UNICODE
<?php
$item = [
'product_name' => '新款智能手机',
'price' => 2999.00,
'description' => '一款功能强大的旗舰手机。'
];
echo "--- 默认转义效果 ---\n";
echo json_encode($item);
// 输出: {"product_name":"\u65b0\u6b3e\u667a\u80fd\u624b\u673a","price":2999,"description":"\u4e00\u6b3e\u529f\u80fd\u5f3a\u5927\u7684\u65d7\u8230\u624b\u673a\u3002"}
echo "\n\n--- 使用 JSON_UNESCAPED_UNICODE ---\n";
echo json_encode($item, JSON_UNESCAPED_UNICODE);
// 输出: {"product_name":"新款智能手机","price":2999,"description":"一款功能强大的旗舰手机。"}
?>通过对比你会发现,加上
JSON_UNESCAPED_UNICODE
Content-Type: application/json; charset=utf-8
json_encode
默认情况下,
json_encode
为了解决这个问题,
json_encode
JSON_PRETTY_PRINT
<?php
$userProfile = [
'id' => 1001,
'username' => 'dev_user',
'email' => 'dev@example.com',
'settings' => [
'theme' => 'dark',
'notifications' => [
'email' => true,
'sms' => false,
'push' => true
],
'language' => 'zh-CN'
],
'last_login' => '2023-10-27 10:30:00'
];
echo "--- 默认紧凑输出 ---\n";
echo json_encode($userProfile);
echo "\n\n--- 使用 JSON_PRETTY_PRINT 格式化输出 ---\n";
echo json_encode($userProfile, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
?>当你运行上面的代码,你会明显感受到
JSON_PRETTY_PRINT
json_encode
null
json_encode
json_encode
null
几个常见的原因和解决方案:
资源类型 (Resource Types) PHP 中的资源类型,比如数据库连接句柄 (
mysqli_result
PDO
resource(stream)
json_encode
<?php
// 假设 $fileHandle 是一个文件资源
$fileHandle = fopen('test.txt', 'r');
$data = ['name' => 'test', 'handle' => $fileHandle];
$json = json_encode($data);
echo $json; // {"name":"test","handle":{}} 或直接返回null
fclose($fileHandle); // 记得关闭资源
// 正确的做法是提取数据
$fileContent = file_get_contents('test.txt');
$data = ['name' => 'test', 'content' => $fileContent];
$json = json_encode($data);
echo $json; // {"name":"test","content":"文件内容..."}
?>包含循环引用的对象 (Circular References) 如果你的对象中存在循环引用(例如,对象 A 引用对象 B,同时对象 B 又引用对象 A),
json_encode
null
不可序列化的对象 (Non-Serializable Objects) 默认情况下,
json_encode
JsonSerializable
jsonSerialize()
json_encode
<?php
class MyUser implements JsonSerializable {
private $id;
public $name;
protected $passwordHash; // 不想被序列化
public function __construct($id, $name, $passwordHash) {
$this->id = $id;
$this->name = $name;
$this->passwordHash = $passwordHash;
}
public function jsonSerialize(): mixed {
// 只暴露 id 和 name,不暴露 passwordHash
return [
'user_id' => $this->id,
'user_name' => $this->name
];
}
}
$user = new MyUser(1, 'Alice', 'hashed_pass');
echo json_encode($user, JSON_PRETTY_PRINT);
/*
输出:
{
"user_id": 1,
"user_name": "Alice"
}
*/
?>NaN
Infinity
NaN
Infinity
NaN
INF
json_encode
null
null
编码错误检查 当你遇到
json_encode
null
json_last_error()
json_last_error_msg()
json_encode
json_decode
<?php
$invalidData = [
'value' => NAN // 包含 NaN
];
$json = json_encode($invalidData);
if ($json === false) { // 或者直接检查 $json === null
echo "JSON 编码失败!错误代码:" . json_last_error() . "\n";
echo "错误信息:" . json_last_error_msg() . "\n";
} else {
echo $json;
}
// 输出:
// JSON 编码失败!错误代码:5
// 错误信息:Malformed UTF-8 characters, possibly incorrectly encoded
// (在 PHP 7.1+,对 NaN/INF 会返回 JSON_ERROR_INF_OR_NAN)
?>通过这些错误信息,你就能更精确地定位到问题所在,从而采取相应的处理措施。在实际开发中,养成检查
json_last_error()
以上就是php中json_encode函数怎么用 php中json_encode函数用法实例的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号