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
相关产品推荐
相关产品推荐

