Flutter中jsonDecode抛出FormatException异常,请求协助排查
问题排查:Google Sheets数据接口返回HTML导致JSON解码失败
问题现象
原本正常从Google Apps Script接口获取JSON数据并在日历展示,现在执行dynamic jsonAppData = convert.jsonDecode(data.body);时抛出FormatException,错误提示返回内容开头是HTML标签(<!doctype html>),说明接口未返回预期的JSON数据。
排查步骤
- 检查请求状态码:解码前先打印
data.statusCode,若状态码不是200,说明请求本身失败(如403权限错误、500脚本内部错误),此时返回的大概率是错误页面HTML。 - 查看实际返回内容:解码前打印
data.body,确认返回的是完整JSON还是错误页面,比如是否包含Google登录提示、脚本报错信息。 - 验证Google Apps Script部署状态:
- 登录Google Apps Script后台,检查部署是否处于活跃状态,是否过期。
- 确认部署权限设置:若之前是“任何人,甚至匿名”访问,现在是否被修改为“仅限组织内用户”或“仅限自己”,导致未登录请求返回登录页面HTML。
- 检查脚本输出逻辑:确保脚本没有输出多余内容,比如不要在返回JSON前添加
Logger.log或其他打印语句,必须用ContentService.createTextOutput(jsonString).setMimeType(ContentService.MimeType.JSON)返回纯JSON。
代码优化建议
在现有代码中添加状态码校验和异常捕获,避免直接崩溃,同时方便调试:
Future<List> getDataFromGoogleSheet() async { try { Response data = await http.get( Uri.parse( "https://script.google.com/macros/s/AKfycbybaFrTEBrxTIni8izFKMQYNNAe7ciVMlqF0OUHyWujjRR2AQ8zDyQzh96tleRKMHSN/exec"), ); // 先检查请求状态码 if (data.statusCode != 200) { print('请求失败,状态码:${data.statusCode},返回内容:${data.body}'); return []; } // 打印返回内容,方便调试 print('接口返回内容:${data.body}'); dynamic jsonAppData = convert.jsonDecode(data.body); final List<Meeting> appointmentData = []; for (dynamic item in jsonAppData) { var recurrence = item['byday']; Meeting meetingData = Meeting( eventName: item['subject'], from: _convertDateFromString(item['starttime']), to: _convertDateFromString(item['endtime']), background: Colors.grey.shade800, recurrenceRule: 'FREQ=DAILY;INTERVAL=7;BYDAY:$recurrence;COUNT=10', ); appointmentData.add(meetingData); String notes = item['notes']; } return appointmentData; } catch (e) { print('数据处理异常:$e'); return []; } }
内容的提问来源于stack exchange,提问作者Adán Alvarez
相关产品推荐
相关产品推荐

