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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:23:32