Flutter开发:如何将远程返回的.txt格式响应转换为JSON数据
解决方案
方法1:直接解析(适合快速调试/简单场景)
- 首先引入Dart内置的转换库:
import 'dart:convert'; - 拿到你解码得到的字符串后,调用
jsonDecode方法即可直接转换为可操作的Map结构,示例代码如下:
void handleData() async { String jsonStr = await fetchData(); if (jsonStr != "Error") { // JSON字符串转Map Map<String, dynamic> jsonData = jsonDecode(jsonStr); // 直接读取对应字段 bool isSuccess = jsonData['success']; List<dynamic> dataList = jsonData['data']; // 遍历data数组操作数据 for (var item in dataList) { String id = item['id']; String number = item['number']; String text = item['text']; print('id:$id, 编号:$number, 文本:$text'); } } }
注意:你提供的JSON示例中
data数组最后一个对象末尾多了一个多余逗号,属于JSON语法错误,若实际接口返回真的带了这个逗号,需要先执行jsonStr = jsonStr.replaceAll(', }', '}').replaceAll(', ]', ']')处理多余逗号后再解析,否则会抛出解析异常。
方法2:模型类序列化(推荐正式环境使用)
直接用dynamic类型没有类型校验,运行时容易出现字段名写错、类型不匹配的崩溃,推荐定义对应的数据模型来解析,使用示例如下:
- 首先定义数据模型:
// 单条数据条目模型 class DataItem { final String id; final String number; final String text; DataItem({required this.id, required this.number, required this.text}); factory DataItem.fromJson(Map<String, dynamic> json) { return DataItem( id: json['id'] as String, number: json['number'] as String, text: json['text'] as String, ); } } // 接口响应整体模型 class ApiResponse { final bool success; final List<DataItem> data; ApiResponse({required this.success, required this.data}); factory ApiResponse.fromJson(Map<String, dynamic> json) { var dataList = json['data'] as List; List<DataItem> items = dataList.map((i) => DataItem.fromJson(i)).toList(); return ApiResponse( success: json['success'] as bool, data: items, ); } }
- 调用解析:
void handleData() async { String jsonStr = await fetchData(); if (jsonStr != "Error") { Map<String, dynamic> jsonMap = jsonDecode(jsonStr); ApiResponse response = ApiResponse.fromJson(jsonMap); // 直接调用模型属性即可,有完整的类型提示和编译校验 print('请求是否成功:${response.success}'); for (var item in response.data) { print(item.text); } } }
内容的提问来源于stack exchange,提问作者P-J
相关产品推荐
相关产品推荐

