Laravel7 非JS环境下如何向现有JSON对象插入新JSON对象
解决方案
你操作失败的核心原因是原始数据中json字段本身是一个转义后的JSON字符串,需要分层解码处理,不能直接对整个外层JSON解码后直接合并,以下是完整可运行的PHP实现方案:
完整操作步骤
1. 定义源数据
// 原始JSON字符串 $originalJson = <<<JSON { "id": 1, "horaire_id": 1, "json": "{\"i\": \"idHoraire1-NumReservation1\", \"x\": 3, \"y\": 2, \"w\":5, \"h\": 3, \"j\": 0}", "num_reserv": 1, "nombre_heures": 7.5, "created_at": "2021-09-16T13:55:00.000000Z", "updated_at": "2021-09-16T13:55:03.000000Z" } JSON; // 待插入的JSON字符串 $toInsertJson = <<<JSON { "id": 1, "evenement_type_id": 1, "reservation_id": 1, "posinreserv": 1, "campus_id": 1, "comment": null, "created_at": null, "updated_at": null } JSON;
2. 分层解码
// 解码外层原始JSON为数组 $originalArr = json_decode($originalJson, true); // 解码原始数据中嵌套的json字段字符串为数组 $innerJsonArr = json_decode($originalArr['json'], true); // 解码待插入的JSON为数组 $toInsertArr = json_decode($toInsertJson, true);
3. 按需求合并数据
两种常见场景二选一:
- 场景1:把待插入对象合并到外层的原始JSON对象中
$mergedArr = array_merge($originalArr, $toInsertArr); // 转成最终JSON $finalJson = json_encode($mergedArr, JSON_PRETTY_PRINT);
- 场景2:把待插入对象合并到原始数据内部的
json字段中
// 合并内部数据 $mergedInnerArr = array_merge($innerJsonArr, $toInsertArr); // 把合并后的内部数据重新编码为字符串,放回原数组 $originalArr['json'] = json_encode($mergedInnerArr); // 转成最终JSON $finalJson = json_encode($originalArr, JSON_PRETTY_PRINT);
注意:
array_merge会以新数组的同名字段覆盖旧数组,如果需要保留原数组的字段优先,可以改用数组加号运算符:$mergedArr = $originalArr + $toInsertArr
调试技巧
如果解码失败,可以用json_last_error_msg()打印错误信息,排查是否存在JSON格式错误、转义异常问题,Laravel中也可以用dd(json_last_error_msg())快速调试。
内容的提问来源于stack exchange,提问作者David Dubois
相关产品推荐
相关产品推荐

