Flutter使用http get方法提取结构化JSON指定对象的实现
基于http库实现嵌套JSON响应的目标字段提取
纯http库和Chopper的核心差异在于:Chopper会在内部自动完成响应字符串到结构化Map的转换,纯http库默认只返回字符串格式的响应体,需要手动完成解码后才能按键取值。
具体实现步骤:
- 引入核心依赖:需要导入
dart:convert用于JSON解码,以及官方http包的请求能力 - 完成GET请求后,先校验响应状态码,避免非200状态下的无效解析
- 调用
jsonDecode方法将响应体字符串转换为Map<String, dynamic>结构 - 直接通过键名索引提取目标
user对象即可,取值逻辑和Chopper中完全一致
可直接复用的实现代码:
import 'dart:convert'; import 'package:http/http.dart' as http; Future<Map<String, dynamic>?> getTargetUser() async { final res = await http.get(Uri.parse('你的接口请求地址')); if (res.statusCode != 200) { throw Exception('请求异常,状态码:${res.statusCode}'); } // 手动完成JSON解码,这是和Chopper的唯一操作差异 final decodedData = jsonDecode(res.body); // 直接按键名提取user对象,适配空安全做可空标注 final user = decodedData['user'] as Map<String, dynamic>?; return user; }
注意事项:
- 空安全适配:取值时可根据接口的实际返回规则加可空标注,避免硬转非空类型导致的运行时崩溃;需要更强鲁棒性时,可在JSON解码后先判断返回结构的类型,再执行后续取值操作。
- 如果解码过程抛出
FormatException,先检查接口返回的JSON格式是否合法,比如示例结构中"email:""example@email.com"为缺漏引号的非法格式,修正为"email": "example@email.com"后即可正常解析。 - 不需要额外引入序列化、反射类依赖,只要响应结构匹配,提取逻辑和Chopper中的
response.body["user"]完全等价。
内容的提问来源于stack exchange,提问作者Davii The King
相关产品推荐
相关产品推荐

