PHP如何写JSON数据:从基础到实践的全面指南
在Web开发中,JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其易读、易解析的特性被广泛应用,PHP作为后端开发的核心语言之一,经常需要将数据转换为JSON格式并输出给前端或其他服务,本文将详细介绍PHP中写入JSON数据的多种方法、常见问题及最佳实践,帮助开发者这一核心技能。
PHP写入JSON数据的基础方法:json_encode()
PHP提供了内置函数json_encode(),将PHP变量(如数组、对象)转换为JSON格式的字符串,这是最常用、最基础的JSON写入方式。
基本语法
json_encode(mixed $value, int $depth = 512, int $options = 0): string|false
$value:要编码的PHP变量(数组、对象等)。$depth:指定递归深度,默认512(适用于大多数场景)。$options:可选的编码选项,用于控制输出格式(如美化、转义斜杠等)。
示例:编码PHP数组为JSON
(1)索引数组
$phpArray = ["apple", "banana", "cherry"]; $jsonString = json_encode($phpArray); echo $jsonString; // 输出: ["apple","banana","cherry"]
(2)关联数组
$assocArray = [
"name" => "张三",
"age" => 25,
"hobbies" => ["reading", "coding"]
];
$jsonString = json_encode($assocArray);
echo $jsonString;
// 输出: {"name":"张三","age":25,"hobbies":["reading","coding"]}
(3)对象
class User {
public $name;
public $email;
public function __construct($name, $email) {
$this->name = $name;
$this->email = $email;
}
}
$user = new User("李四", "lisi@example.com");
$jsonString = json_encode($user);
echo $jsonString;
// 输出: {"name":"李四","email":"lisi@example.com"}
常用$options参数
通过$options参数可以调整JSON编码的行为,常用选项如下:
(1)JSON_PRETTY_PRINT:美化输出(格式化缩进)
$data = [
"name" => "王五",
"age" => 30,
"skills" => ["PHP", "JavaScript", "MySQL"]
];
$prettyJson = json_encode($data, JSON_PRETTY_PRINT);
echo $prettyJson;
/* 输出:
{
"name": "王五",
"age": 30,
"skills": [
"PHP",
"JavaScript",
"MySQL"
]
}
*/
(2)JSON_UNESCAPED_UNICODE:避免中文等Unicode字符被转义
默认情况下,json_encode()会将非ASCII字符(如中文)转义为Unicode编码(如\u4e2d\u6587),使用JSON_UNESCAPED_UNICODE可保留原字符:
$data = ["city" => "北京", "country" => "中国"];
$jsonString = json_encode($data, JSON_UNESCAPED_UNICODE);
echo $jsonString; // 输出: {"city":"北京","country":"中国"}
(3)JSON_UNESCAPED_SLASHES:避免斜杠被转义
当数据中包含斜杠(如URL路径)时,默认会被转义为\/:
$data = ["path" => "/var/www/html/"];
$jsonString = json_encode($data, JSON_UNESCAPED_SLASHES);
echo $jsonString; // 输出: {"path":"/var/www/html/"}
(4)组合使用多个选项
通过按位或()组合多个选项:
$options = JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES; $prettyJson = json_encode($data, $options);
处理JSON编码错误
当数据无法被编码为JSON时(如资源类型、循环引用等),json_encode()会返回false,此时可通过json_last_error()和json_last_error_msg()获取错误信息。
常见错误场景
(1)编码资源类型
$fileResource = fopen("test.txt", "r");
$jsonString = json_encode($fileResource); // 返回false
if ($jsonString === false) {
echo "编码失败: " . json_last_error_msg(); // 输出: 类型错误,无法编码资源
}
fclose($fileResource);
(2)循环引用(对象或数组相互引用)
$obj1 = new stdClass();
$obj2 = new stdClass();
$obj1->ref = $obj2;
$obj2->ref = $obj1; // 循环引用
$jsonString = json_encode($obj1); // 返回false
if ($jsonString === false) {
echo "编码失败: " . json_last_error_msg(); // 输出: 类型错误,循环引用
}
(3)编码深度超过限制
$deepArray = [];
$temp = &$deepArray;
for ($i = 0; $i < 600; $i++) { // 默认深度限制为512
$temp[] = [];
$temp = &$temp[count($temp) - 1];
}
$jsonString = json_encode($deepArray); // 返回false
if ($jsonString === false) {
echo "编码失败: " . json_last_error_msg(); // 输出: 超过最大递归深度
}
错误处理示例
function safeJsonEncode($data, $options = 0) {
$jsonString = json_encode($data, $options);
if ($jsonString === false) {
throw new RuntimeException("JSON编码失败: " . json_last_error_msg());
}
return $jsonString;
}
try {
$result = safeJsonEncode(["invalid" => fopen("test.txt", "r")]);
} catch (RuntimeException $e) {
echo "捕获异常: " . $e->getMessage(); // 输出: JSON编码失败: 类型错误,无法编码资源
}
将JSON数据写入文件
在实际开发中,经常需要将JSON数据持久化存储到文件中,可通过file_put_contents()函数实现,结合json_encode()生成JSON字符串。
基本写入
$data = [
"users" => [
["id" => 1, "name" => "张三"],
["id" => 2, "name" => "李四"]
],
"total" => 2
];
$jsonString = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
$filePath = "data.json";
// 写入文件(如果文件不存在则创建,存在则覆盖)
$result = file_put_contents($filePath, $jsonString);
if ($result !== false) {
echo "JSON数据已成功写入文件,写入字节数: " . $result;
} else {
echo "写入文件失败";
}
执行后,data.json如下:
{
"users": [
{
"id": 1,
"name": "张三"
},
{
"id": 2,
"name": "李四"
}
],
"total": 2
}
追加JSON数据(注意事项)
file_put_contents()默认覆盖文件内容,若需追加数据,需确保追加的内容是合法的JSON数组或对象的一部分,否则会导致文件格式损坏,若要将多个JSON对象追加到数组中:
// 假设data.json初始内容为: [{"id": 1, "name": "张三"}]
$newData = ["id" => 2, "name" => "李四"];
// 读取现有数据
$existingData = json_decode(file_get_contents("data.json"), true);
// 追加新数据
$existingData[] = $newData;
// 重新写入文件
file_put_contents("data.json", json_encode($existingData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
输出JSON数据到HTTP响应
在API开发中,经常需要将PHP数据编码为JSON并直接输出给前端客户端,此时需设置正确的HTTP头信息,并确保输出前不包含任何额外字符(如空格、HTML标签)。
基本输出步骤
- 设置
Content-Type头为application/json,告知客户端返回的是JSON数据。 - 使用
json_encode()编码数据。 - 输出JSON字符串,并终止脚本(避免后续代码



还没有评论,来说两句吧...