Dart中如何解析服务端请求返回的JSON数据并赋值给变量
Dart 网络请求JSON解析实现方案
前置准备
在代码头部导入系统内置的JSON转换库:
import 'dart:convert';
两种解析实现方式
你可以根据业务响应的复杂度选择对应的解析方案:
方式一:手动解析(适合结构简单的响应)
直接修改你原有代码中状态码为200的分支即可:
if (response.statusCode == 200) { // 先把响应流转换为字符串 String responseStr = await response.stream.bytesToString(); // 解析JSON为Dart可操作的对象 // 若服务端返回JSON对象用Map接收,返回JSON数组用List接收 Map<String, dynamic> jsonData = jsonDecode(responseStr); // 按字段取值赋值给变量即可,示例: int responseCode = jsonData['code']; String responseMsg = jsonData['message']; dynamic businessData = jsonData['data']; // 后续可直接使用上述变量处理业务逻辑 print("请求成功,返回信息:$responseMsg"); } else { print(response.reasonPhrase); }
方式二:模型类解析(适合复杂结构,类型安全更推荐)
这种方式可以避免字段写错、类型不匹配的问题,首先定义和服务端返回结构完全匹配的模型类,举个例子,假设服务端返回结构如下:
{ "code": 200, "msg": "查询成功", "data": { "id": 1001, "inquiryResult": "已提交", "createTime": "2024-01-01" } }
对应的模型类代码:
class InquiryResponse { final int code; final String msg; final ResponseData? data; InquiryResponse({ required this.code, required this.msg, this.data, }); factory InquiryResponse.fromJson(Map<String, dynamic> json) { return InquiryResponse( code: json['code'] as int, msg: json['msg'] as String, data: json['data'] != null ? ResponseData.fromJson(json['data']) : null, ); } } class ResponseData { final int id; final String inquiryResult; final String createTime; ResponseData({ required this.id, required this.inquiryResult, required this.createTime, }); factory ResponseData.fromJson(Map<String, dynamic> json) { return ResponseData( id: json['id'] as int, inquiryResult: json['inquiryResult'] as String, createTime: json['createTime'] as String, ); } }
解析时的代码实现:
if (response.statusCode == 200) { String responseStr = await response.stream.bytesToString(); Map<String, dynamic> jsonMap = jsonDecode(responseStr); // 直接初始化模型类变量,后续取属性有IDE类型提示,不会出错 InquiryResponse res = InquiryResponse.fromJson(jsonMap); // 使用示例 print(res.msg); print(res.data?.inquiryResult); }
注意事项
- 解析前先确认服务端返回的JSON根结构是对象还是数组,若为数组,
jsonDecode返回的是List类型,需要对应调整解析逻辑 - 字段取值时建议做空判断和类型校验,避免服务端字段缺失、类型异常导致的App崩溃
- 若响应结构非常复杂,可使用
json_serializable库自动生成序列化代码,减少手写fromJson的工作量
内容的提问来源于stack exchange,提问作者Navid Shokoufeh
相关产品推荐
相关产品推荐

