如何在Dart中使用Get方法并将服务端返回的JSON解码为变量?
Dart 发起Get网络请求并解析JSON的实现方案
前置依赖配置
首先需要在项目的pubspec.yaml中添加官方http库依赖:
dependencies: http: ^1.1.0 # 可替换为当前最新版本
Dart内置的dart:convert库用于JSON解码,无需额外引入。
实现步骤
- 导入http和convert库
- 编写异步方法,用
http.get发起请求,通过await等待请求结果返回 - 判断响应状态码为200(请求成功)后,用
jsonDecode解码响应体的JSON字符串为Map结构 - 将Map中的值直接赋值给对应变量,或映射为实体类属性使用(更推荐)
基础示例(直接解析到变量)
import 'package:http/http.dart' as http; import 'dart:convert'; void main() async { // 发起Get请求 final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/todos/1')); if (response.statusCode == 200) { // 解码JSON为Map Map<String, dynamic> resData = jsonDecode(response.body); // 赋值给对应变量 int taskId = resData['id']; String taskTitle = resData['title']; bool isCompleted = resData['completed']; // 测试输出 print('ID: $taskId, 标题: $taskTitle, 是否完成: $isCompleted'); } else { print('请求失败,状态码: ${response.statusCode}'); } }
更安全的实现(映射为实体类)
直接通过Map的key取值容易出现拼写错误、类型不匹配的问题,推荐把JSON映射为Dart实体类使用:
// 首先定义实体类 class Task { final int id; final String title; final bool completed; Task({required this.id, required this.title, required this.completed}); // 实现JSON转实体类的工厂方法 factory Task.fromJson(Map<String, dynamic> json) { return Task( id: json['id'], title: json['title'], completed: json['completed'], ); } } // 改造请求逻辑 import 'package:http/http.dart' as http; import 'dart:convert'; void main() async { final response = await http.get(Uri.parse('https://jsonplaceholder.typicode.com/todos/1')); if (response.statusCode == 200) { Map<String, dynamic> jsonMap = jsonDecode(response.body); Task task = Task.fromJson(jsonMap); // 直接通过实体类属性取值,有类型校验,不易出错 print('ID: ${task.id}, 标题: ${task.title}, 是否完成: ${task.completed}'); } }
注意事项
- 网络请求属于异步操作,必须在标记了
async的方法中执行,请求前加await关键字等待结果返回 - 必须做状态码校验后再解析响应内容,避免请求失败时解码报错
- 如果是Flutter端使用,安卓需要在
AndroidManifest.xml中添加网络权限,iOS需要在Info.plist中配置允许HTTP请求(如果接口未用HTTPS)
内容的提问来源于stack exchange,提问作者Navid Shokoufeh
相关产品推荐
相关产品推荐

