PHP如何读取和操作JSON文件:从基础到实用技巧
在Web开发中,JSON(JavaScript Object Notation)因其轻量级、易读的数据格式特性,成为前后端数据交互的主流选择,PHP作为服务器端脚本语言,提供了强大的JSON处理能力,无论是读取本地JSON文件、解析数据,还是将PHP数组/对象转换为JSON并写入文件,都能高效实现,本文将详细介绍PHP操作JSON文件的完整流程,包括基础语法、常见场景及实用技巧,助你轻松这一技能。
PHP操作JSON文件的核心函数
PHP内置了多个与JSON相关的函数,它们是处理JSON文件的“利器”,在开始具体操作前,先快速认识这些核心函数:
| 函数名 | 作用 | 返回值 |
|---|---|---|
file_get_contents() |
读取整个文件内容为字符串 | 成功返回文件内容,失败返回false |
file_put_contents() |
将字符串写入文件(覆盖/追加) | 成功返回写入字节数,失败返回false |
json_decode() |
将JSON字符串解码为PHP变量 | 默认返回object,设置true时返回array |
json_encode() |
将PHP变量编码为JSON字符串 | 成功返回JSON字符串,失败返回null |
json_last_error() |
获取最后一次JSON操作产生的错误码 | 整数错误码(如JSON_ERROR_NONE表示无错误) |
读取并解析JSON文件
读取JSON文件是常见操作,比如加载配置文件、读取缓存数据等,流程分为两步:读取文件内容 → 解码为PHP变量。
读取文件内容:file_get_contents()
首先使用file_get_contents()读取JSON文件,将其转换为字符串,注意:文件路径需正确(支持相对路径和绝对路径),且文件需有读取权限。
$jsonFilePath = 'config.json'; // JSON文件路径
$jsonString = file_get_contents($jsonFilePath);
// 检查文件是否读取成功
if ($jsonString === false) {
die('无法读取JSON文件,请检查路径或权限');
}
解码JSON字符串:json_decode()
获取JSON字符串后,用json_decode()将其转换为PHP变量(默认为object,第二个参数设为true可转为array)。
// 解码为对象(默认) $dataObject = json_decode($jsonString); echo "用户名:" . $dataObject->username . "\n"; // 输出: 用户名:张三 // 解码为关联数组(推荐,便于数组操作) $dataArray = json_decode($jsonString, true); echo "年龄:" . $dataArray['age'] . "\n"; // 输出: 年龄:25
完整示例:读取并解析JSON文件
假设有一个config.json如下:
{
"database": {
"host": "localhost",
"port": 3306,
"username": "root",
"password": "123456"
},
"api_key": "abcdef123456",
"debug_mode": true
}
用PHP读取并解析:
<?php
$jsonFile = 'config.json';
$jsonString = file_get_contents($jsonFile);
if ($jsonString === false) {
exit('文件读取失败');
}
// 解码为关联数组
$config = json_decode($jsonString, true);
// 输出解析结果
echo "数据库主机:" . $config['database']['host'] . "\n";
echo "API密钥:" . $config['api_key'] . "\n";
echo "调试模式:" . ($config['debug_mode'] ? '开启' : '关闭') . "\n";
?>
输出结果:
数据库主机:localhost
API密钥:abcdef123456
调试模式:开启
处理解码错误:json_last_error()
如果JSON字符串格式错误(如引号不匹配、逗号多余),json_decode()会返回null,此时可通过json_last_error()获取错误原因。
$invalidJson = '{"name": "李四", "age": 30,}'; // 注意末尾多余逗号,格式错误
$data = json_decode($invalidJson, true);
if ($data === null) {
$errorCode = json_last_error();
$errorMsg = json_last_error_msg(); // PHP 5.5+ 获取错误描述
echo "JSON解码失败,错误码:$errorCode,错误信息:$errorMsg";
}
输出结果:
JSON解码失败,错误码:4,错误信息:Syntax error
生成并写入JSON文件
除了读取,PHP还可以将数据(如数组、对象)转换为JSON字符串,并写入文件,流程分为两步:编码为JSON字符串 → 写入文件。
编码为JSON字符串:json_encode()
使用json_encode()将PHP变量转换为JSON字符串,注意:中文默认会被Unicode编码(如\u4e2d\u6587),若需保留中文,需设置JSON_UNESCAPED_UNICODE选项。
$userData = [
'username' => '王五',
'age' => 28,
'hobbies' => ['阅读', '旅行', '编程'],
'info' => ['city' => '北京', 'gender' => '男']
];
// 编码为JSON字符串(中文被Unicode转义)
$jsonString = json_encode($userData);
echo $jsonString . "\n";
// 编码为JSON字符串(保留中文,推荐)
$jsonStringWithChinese = json_encode($userData, JSON_UNESCAPED_UNICODE);
echo $jsonStringWithChinese . "\n";
输出结果:
{"username":"\u738b\u4e94","age":28,"hobbies":["\u9605\u8bfb","\u65c5\u884c","\u7f16\u7a0b"],"info":{"city":"\u5317\u4eac","gender":"\u7537"}}
{"username":"王五","age":28,"hobbies":["阅读","旅行","编程"],"info":{"city":"北京","gender":"男"}}
写入文件:file_put_contents()
获取JSON字符串后,用file_put_contents()写入文件,该函数会自动创建文件(若不存在),并覆盖原有内容(除非指定FILE_APPEND追加模式)。
$jsonData = [
'product' => '智能手机',
'price' => 2999,
'stock' => 100,
'tags' => ['电子产品', '5G', '拍照']
];
// 编码为JSON(保留中文,格式化输出)
$jsonString = json_encode($jsonData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
// JSON_PRETTY_PRINT:格式化输出(缩进、换行),提升可读性
// 写入文件(若文件不存在会创建,存在则覆盖)
$filePath = 'product.json';
$result = file_put_contents($filePath, $jsonString);
if ($result === false) {
die('文件写入失败');
} else {
echo "成功写入文件,共写入 $result 字节";
}
生成的product.json:
{
"product": "智能手机",
"price": 2999,
"stock": 100,
"tags": [
"电子产品",
"5G",
"拍照"
]
}
追加JSON数据(高级场景)
若需向JSON文件追加数据(如日志记录),需注意:JSON文件本身是“单一结构”,无法直接追加对象/数组,通常的做法是读取原文件→解码为数组→修改数组→重新编码并覆盖写入。
向product.json追加一个新商品:
// 1. 读取原文件并解码
$filePath = 'product.json';
$jsonString = file_get_contents($filePath);
$products = json_decode($jsonString, true);
// 2. 修改数组(追加新商品)
$newProduct = [
'product' => '无线耳机',
'price' => 599,
'stock' => 200,
'tags' => ['电子产品', '蓝牙', '降噪']
];
$products[] = $newProduct; // 将新商品追加到数组末尾
// 3. 重新编码并覆盖写入
$newJsonString = json_encode($products, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
file_put_contents($filePath, $newJsonString);
echo "商品追加成功!";
更新后的product.json:
[
{
"product": "智能手机",
"price": 2999,
"stock": 100,
"tags": [
"电子产品",
"5G",
"拍照"
]
},
{
"product": "无线耳机",


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