You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP动态更新未知层级嵌套JSON文件的实现方法

PHP动态更新任意深度JSON节点实现方案

原方案失效原因

你之前尝试拼接属性访问字符串的方案无法生效,核心原因是PHP不会解析存储在字符串变量中的属性访问语法,拼接得到的只是普通文本,不会被识别为对象的层级访问逻辑。PHP没有提供直接传入路径数组就完成嵌套赋值的内置函数,通过引用逐层遍历路径是最稳定、性能最好的实现方式。

重要安全提示:直接将请求传入的Folder、File参数拼接文件路径存在路径遍历漏洞,正式使用前必须增加白名单校验,限制程序仅能操作指定JSON目录下的文件,避免被恶意读取、篡改服务器其他文件。

另外你的初始代码存在参数名拼写错误:$_REQUEST['JsonObect'] 拼写有误,应为$_REQUEST['JsonObject']。

可直接使用的实现代码

推荐将JSON解析为关联数组操作,兼容性更强:

// 接收参数
$Folder = $_REQUEST['Folder'];
$File = $_REQUEST['File'];
$NewJSONValue = $_REQUEST['JsonValue'];
$pathArr = json_decode($_REQUEST['JsonObject'], true); // 解析得到嵌套路径索引数组

// 读取并解析目标JSON文件
$sourcePath = $Folder . $File;
$jsonData = json_decode(file_get_contents($sourcePath), true);

// 核心逻辑:通过引用逐层定位目标节点
$currentPointer = &$jsonData;
foreach ($pathArr as $pathSegment) {
    // 中间节点不存在时自动初始化,避免访问报错
    if (!isset($currentPointer[$pathSegment])) {
        $currentPointer[$pathSegment] = [];
    }
    $currentPointer = &$currentPointer[$pathSegment];
}
// 指针最终指向目标节点,直接赋值
$currentPointer = $NewJSONValue;
// 销毁引用避免后续逻辑出现非预期修改
unset($currentPointer);

// 编码后写回文件
file_put_contents('../../' . $Folder . '/' . $File, json_encode($jsonData, JSON_UNESCAPED_UNICODE));

如果你更习惯操作stdClass对象格式,仅需要调整遍历部分的访问语法即可:

// 解析为stdClass对象
$jsonData = json_decode(file_get_contents($sourcePath));

$currentPointer = &$jsonData;
foreach ($pathArr as $pathSegment) {
    if (!isset($currentPointer->$pathSegment)) {
        $currentPointer->$pathSegment = new stdClass();
    }
    $currentPointer = &$currentPointer->$pathSegment;
}
$currentPointer = $NewJSONValue;
unset($currentPointer);

不推荐的替代方案

不要尝试用eval()执行拼接出来的属性访问字符串,这类写法不仅调试维护成本高,还会引入严重的代码注入安全风险,完全不适合生产环境使用。

内容的提问来源于stack exchange,提问作者Francois Lemieux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 06:57:14