PHP后端调整数据结构适配Flutter客户端JSON解析
解决PHP后端返回多段JSON导致Flutter解析失败的问题
问题根源是后端两次独立输出JSON字符串,拼接后的内容不符合JSON语法规范,导致Flutter的jsonDecode抛出格式异常。只需在PHP端把所有要返回的数据合并到一个数组中,仅做一次JSON编码和输出即可解决。
调整PHP后端代码
方案1:合并登录状态与查询结果为顶层对象
把登录状态$login_data和查询结果$return_arr整合到同一个数组,统一输出:
// 合并所有需要返回的数据 $response = [ 'success' => $login_data['success'], 'user' => $login_data['user'], 'data' => $return_arr // 将查询结果作为data字段的值 ]; // 设置响应头(确保客户端识别JSON格式,推荐添加) header('Content-Type: application/json; charset=utf-8'); // 仅输出一次合法JSON echo json_encode($response);
方案2:直接追加查询结果到原登录状态数组
如果$login_data本身已包含success、user等字段,可直接把查询结果追加进去:
// 将查询结果附加到登录状态数组中 $login_data['data'] = $return_arr; header('Content-Type: application/json; charset=utf-8'); echo json_encode($login_data);
两种方案最终返回的合法JSON示例:
{ "success": 1, "user": {"imie":"Name1","email":"abcdef@gmail.com"}, "data": [ {"email":"some.name1@gmail.com","data":"2023-09-27 20:22:42"}, {"email":"some.name2@gmail.com","data":"2023-09-27 20:22:42"} ] }
调整Flutter客户端代码
此时jsonDecode可正常解析,直接访问data['data']即可获取查询结果列表:
final response = await get( Uri.parse('https://www.somehost.com/API/abc.php'), headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': 'Bearer $token', } ); if(response.statusCode == 200){ var data = jsonDecode(response.body); if(data['success'] == 1) { print(data['user']['email']); // 遍历查询结果 List<dynamic> queryResults = data['data']; for(var item in queryResults){ print('邮箱:${item['email']}'); print('日期:${item['data']}'); } } else { print(data['status']); print(data['message']); } }else { print('请求失败...'); print(response.statusCode); }
额外注意事项
- 确保PHP代码无多余输出(如空格、注释、调试echo等),任何非JSON内容都会导致解析失败
- 始终设置
Content-Type: application/json响应头,帮助客户端正确识别数据类型
内容的提问来源于stack exchange,提问作者bzc0fq
相关产品推荐
相关产品推荐

