Shopware 6.5中PHP修改JSON指定键值后保存异常排查求助
问题排查与修复方案
核心问题
你遇到的问题根源在于错误地将文件路径赋值给了$jsonData,而非读取到的文件内容:
- 执行
$jsonData = $fil;时,$jsonData存储的是文件路径字符串,不是有效的JSON内容。 json_decode()解析非JSON格式的字符串会返回null,后续对null进行数组层级赋值,PHP会自动创建出你指定的层级结构,最终保存的自然只有这部分手动生成的内容,完全丢失了原JSON文件的所有数据。
修正后的完整代码
// 生成订单JSON文件路径 $filer = $order1->getOrderNumber() . '_' . $country2->getIso() . '.json'; $fil = __DIR__ . '/' . $filer; // 先检查文件是否存在,避免读取失败 if (!file_exists($fil)) { throw new Exception("订单JSON文件不存在:{$fil}"); } // 读取文件内容 $file_contents = file_get_contents($fil); // 正确将文件内容赋值给$jsonData $jsonData = $file_contents; // 解析JSON并检查格式有效性 $data = json_decode($jsonData, true); if (json_last_error() !== JSON_ERROR_NONE) { throw new Exception("JSON解析失败:" . json_last_error_msg()); } // 确认目标层级存在后再修改值,避免报错 if (isset($data['entity']['payments'][0]['state'])) { $data['entity']['payments'][0]['state']['id'] = $logMessageId; } else { throw new Exception("JSON文件中缺少指定的层级结构"); } // 编码并保存回原文件(保留格式与特殊字符) $updatedJson = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); file_put_contents($fil, $updatedJson);
额外优化说明
- 增加文件存在性检查:提前拦截文件不存在的情况,避免后续操作报错。
- 增加JSON解析校验:快速定位原JSON文件损坏或格式错误的问题。
- 层级存在性判断:防止原JSON结构变动导致的"Undefined array key"错误。
- 编码参数优化:
JSON_PRETTY_PRINT让保存后的JSON保持可读性,JSON_UNESCAPED_UNICODE避免中文等特殊字符被转义。
内容的提问来源于stack exchange,提问作者tee
相关产品推荐
相关产品推荐

