Laravel中JSON存储与解析失败问题求助
问题解决:存储/读取JSON数据失败的修复方案
问题根源
你的核心问题出在JSON数据的生成方式:插入数据时手动拼接类似JSON的字符串,再套json_encode,导致最终存储的是格式无效的JSON(本质是转义后的错误字符串),后续读取时无法正常解析为对象/数组。同时读取代码也存在语法错误和逻辑问题。
修复步骤
1. 修复插入数据的Model代码
放弃手动拼接字符串,直接构造PHP数组,再用json_encode生成标准JSON字符串:
public static function insertPlotDetails($data){ $PlotDetails = array(); $PlotDetails['L_Name'] = $data['Plot']; $PlotDetails['L_Owner'] = $data['Owner']; $PlotDetails['L_Spice'] = $data['Spice']; $PlotDetails['L_AreaAcre'] = $data['Area']; $PlotDetails['L_AreaHa'] = 0; $PlotDetails['L_ProducedAmt_Kg'] = $data['PdAmount']; $PlotDetails['L_District'] = $data['District']; $PlotDetails['L_Block'] = $data['Block']; $PlotDetails['L_Village'] = $data['Village']; $PlotDetails['lat'] = $data['Latitude']; $PlotDetails['lng'] = $data['Longitude']; $PlotDetails['img'] = $data['ImageUpload']; // 构造标准PHP数组,再转JSON $PlotDetails['PdArea_JSON'] = json_encode([ 'TotalProduction' => [ 'PlotName' => $data['Plot'], 'Area' => [ [ 'Name' => 'Main', 'Variant' => [ [ 'IISR_Varada' => $data['IISR_Varada'], 'IISR_Mahima' => $data['IISR_Mahima'], 'Nadia_Nagaland' => $data['Nadia_Nagaland'], 'Nadia_Odisha' => $data['Nadia_Odisha'], 'Karbi' => $data['Karbi'], 'Local' => $data['Local'] ] ] ], [ 'Name' => 'Trial', 'Variant' => [ [ 'IISR_Varada' => $data['T_IISR_Varada'], 'IISR_Mahima' => $data['T_IISR_Mahima'], 'Nadia_Nagaland' => $data['T_Nadia_Nagaland'], 'Nadia_Odisha' => $data['T_Nadia_Odisha'], 'Karbi' => $data['T_Karbi'], 'Local' => $data['T_Local'] ] ] ] ] ] ]); try { $PlotDetails_response = DB::table('locationdb')->insert($PlotDetails); } catch (\Exception $e) { return $e->getMessage(); } return $PlotDetails_response; }
2. 修复读取JSON的代码
先将数据库返回的JSON字符串解析为对象/数组,再正确访问字段:
public function GetJsonTest() { $data = MapModel::GetJsonTest(); $jsonString = $data[0]->PdArea_JSON; // 解析为对象(第二个参数传true则解析为数组) $jsonObj = json_decode($jsonString); // 检查解析是否成功 if (!$jsonObj) { dd('JSON解析失败:' . json_last_error_msg()); } // 访问TotalProduction下的Area字段示例 $totalProduction = $jsonObj->TotalProduction; $areas = $totalProduction->Area; foreach ($areas as $area) { echo "区域名称:{$area->Name}<br>"; foreach ($area->Variant as $variant) { echo "IISR_Varada:{$variant->IISR_Varada}<br>"; echo "IISR_Mahima:{$variant->IISR_Mahima}<br>"; // 其他Variant字段同理 } } // 调试查看完整数据 dd($totalProduction); }
关键说明
- 手动拼接JSON字符串极易出现引号不匹配、格式错误,必须通过PHP数组+
json_encode生成标准JSON。 - 读取时如果解析失败,用
json_last_error_msg()可以快速定位JSON格式问题(比如引号错误、语法不完整)。
内容的提问来源于stack exchange,提问作者Shailang Kharsati
相关产品推荐
相关产品推荐

