Flutter第三方JSON转SkinModel对象失败求助
排查Flutter JSON解析&请求失败的常见原因
1. 先确认网络请求本身是否成功
- 把请求的URL直接贴到浏览器或Postman里测试,看能不能返回正常的JSON数据
- 在请求代码里打印响应状态码和响应体:
如果状态码不是200,或者响应体是HTML错误页面(比如404、500提示),说明请求被第三方站点拦截或地址有误,和解析无关final response = await http.get(Uri.parse(yourUrl)); print('状态码:${response.statusCode}'); print('响应内容:${response.body}');
2. 核对JSON结构与SkinModel的匹配度
- 把第三方返回的JSON复制出来,和你手写的SkinModel逐一对比:
- 字段名是否完全对应(注意JSON的下划线命名和Dart的驼峰命名是否通过
@JsonKey映射正确) - 字段类型是否一致(比如JSON里是数字类型,你Model里写成了String;或者数组对应成了单个对象)
- 有没有必填字段在JSON里返回null,但Model里没标记为可空(比如
final String name;但JSON里name为null,会直接抛出解析异常)
- 字段名是否完全对应(注意JSON的下划线命名和Dart的驼峰命名是否通过
3. 把异常详情打出来,不要只输出提示语
你的Sorry try again应该是在catch块里的统一提示,把具体异常和堆栈信息打印出来,直接定位问题:
try { // 你的Step3解析代码 } catch (e, stackTrace) { print('错误详情:$e'); print('堆栈追踪:$stackTrace'); print('Sorry try again'); }
比如如果是type 'Null' is not a subtype of type 'String',就知道是某个非空字段拿到了null;如果是FormatException,就是JSON格式本身有问题
4. 检查请求头是否符合第三方站点要求
很多站点会校验请求头(比如User-Agent、Referer),模拟浏览器的请求头试试:
final response = await http.get( Uri.parse(yourUrl), headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', }, );
5. 排查SSL证书问题(针对HTTPS站点)
如果第三方站点的SSL证书不被系统信任,Flutter请求会失败,调试时可以临时跳过证书验证(仅调试用,上线绝对不能这么做):
import 'dart:io'; HttpClient client = HttpClient() ..badCertificateCallback = ((X509Certificate cert, String host, int port) => true); final request = await client.getUrl(Uri.parse(yourUrl)); final response = await request.close(); final responseBody = await response.transform(utf8.decoder).join();
内容的提问来源于stack exchange,提问作者Art Noimann
相关产品推荐
相关产品推荐

