Laravel解析JSON报错:Undefined array key 'gm_bk_id' 求修正代码
问题排查与代码修正
问题原因
报错Undefined array key "gm_bk_id"的核心原因是代码遍历层级错误:原代码直接遍历data['locator']['groups']数组,但gm_bk_id、gm_title等游戏相关字段实际存储在每个group对象的games子数组中,导致尝试从group对象读取不存在的键值。
错误信息
Undefined array key "gm_bk_id" {"userId":1,"exception":"[object] (ErrorException(code: 0): Undefined array key "gm_bk_id"
原代码
public function parse() { $data = json_decode(file_get_contents(public_path() . "/telnet.json"), true); $slots = $data['locator']['groups']; foreach($slots as $slot) { Slot::create([ 'game_id' => $slot['gm_bk_id'], 'title' => $slot['gm_title'], 'alias' => $slot['gm_url'], 'provider' => $slot['gr_title'], 'provider_type' => 'TELNET', 'image' => $slot['icons'] ]); } return redirect()->back()->withSuccess('The list updated'); }
待解析的JSON结构
{ "success":true, "api":"ls-thy-by-yhr-id-get", "locator":{ "ico_baseurl":"\/sdfsgre\/icons\/", "groups":[ { "games":[ { "gm_is_board":false, "gm_m_w":1280, "gm_ln":20, "gm_is_copy":true, "gm_url":"Oeprjkg", "gm_is_retro":false, "gm_bk_id":1017, "gm_d_w":1280, "icons":[ { "ic_h":221, "ic_w":300, "ic_name":"oeprjkg_300_221.jpg" }, { "ic_h":135, "ic_w":170, "ic_name":"oeprjkg_170_135.jpg" }, { "ic_h":101, "ic_w":150, "ic_name":"oeprjkg_150_101.jpg" }, { "ic_h":220, "ic_w":220, "ic_name":"oeprjkg_220_220.jpg" } ], "gm_title":"Oeprjkg", "gm_m_h":720, "gm_is_fs":true, "gm_is_mobile":true, "gm_is_pc":true, "gm_new":false, "gm_d_h":720 }, { "gm_is_board":false, "gm_m_w":1280, "gm_ln":10, "gm_is_copy":true, "gm_url":"Tdfhhdf", "gm_is_retro":false, "gm_bk_id":1008, "gm_d_w":1280, "icons":[ { "ic_h":221, "ic_w":300, "ic_name":"Tdfhhdf_300_221.jpg" }, { "ic_h":135, "ic_w":170, "ic_name":"Tdfhhdf_170_135.jpg" }, { "ic_h":101, "ic_w":150, "ic_name":"Tdfhhdf_150_101.jpg" }, { "ic_h":220, "ic_w":220, "ic_name":"Tdfhhdf_220_220.jpg" } ], "gm_title":"Tdfhhdf", "gm_m_h":720, "gm_is_fs":true, "gm_is_mobile":true, "gm_is_pc":true, "gm_new":false, "gm_d_h":720 } ], "gr_title":"Tjtyuk", "gr_id":12 }, { "games":[ { "gm_is_board":false, "gm_m_w":1280, "gm_ln":4096, "gm_is_copy":true, "gm_url":"Idofjio", "gm_is_retro":false, "gm_bk_id":2001, "gm_d_w":1280, "icons":[ { "ic_h":221, "ic_w":300, "ic_name":"Idofjio_300_221.jpg" }, { "ic_h":135, "ic_w":170, "ic_name":"Idofjio_170_135.jpg" }, { "ic_h":101, "ic_w":150, "ic_name":"Idofjio_150_101.jpg" }, { "ic_h":220, "ic_w":220, "ic_name":"Idofjio_220_220.jpg" } ], "gm_title":"Idofjio", "gm_m_h":720, "gm_is_fs":true, "gm_is_mobile":true, "gm_is_pc":true, "gm_new":false, "gm_d_h":720 }, { "gm_is_board":false, "gm_m_w":1280, "gm_ln":243, "gm_is_copy":true, "gm_url":"Egdfhfgh", "gm_is_retro":false, "gm_bk_id":2000, "gm_d_w":1280, "icons":[ { "ic_h":221, "ic_w":300, "ic_name":"Egdfhfgh_300_221.jpg" }, { "ic_h":135, "ic_w":170, "ic_name":"Egdfhfgh_170_135.jpg" }, { "ic_h":101, "ic_w":150, "ic_name":"Egdfhfgh_150_101.jpg" }, { "ic_h":220, "ic_w":220, "ic_name":"Egdfhfgh_220_220.jpg" } ], "gm_title":"Egdfhfgh", "gm_m_h":720, "gm_is_fs":true, "gm_is_mobile":true, "gm_is_pc":true, "gm_new":false, "gm_d_h":720 } ], "gr_title":"Egdfhfgh", "gr_id":19 } ] } }
修正后的代码
public function parse() { $data = json_decode(file_get_contents(public_path() . "/telnet.json"), true); $groups = $data['locator']['groups']; foreach($groups as $group) { foreach($group['games'] as $game) { Slot::create([ 'game_id' => $game['gm_bk_id'], 'title' => $game['gm_title'], 'alias' => $game['gm_url'], 'provider' => $group['gr_title'], 'provider_type' => 'TELNET', 'image' => $game['icons'] ]); } } return redirect()->back()->withSuccess('The list updated'); }
修正说明
- 调整遍历层级:先遍历
groups数组,再嵌套遍历每个group下的games子数组,确保访问到正确的游戏数据对象 - 字段来源修正:游戏相关字段(
gm_bk_id、gm_title等)从$game对象读取,提供商名称gr_title从所属的$group对象读取
内容的提问来源于stack exchange,提问作者WROGRAY
相关产品推荐
相关产品推荐

