Flutter/Dart中如何从HTTP响应提取run_hyperlink数据
在Flutter/Dart中提取HTTP响应里的run_hyperlink内容
需求说明
在Flutter/Dart开发场景下,需从HTTP响应的JSON数据中,提取每个ListNode对象内run_hyperlink中的classid、id、mad_key字段,整理为列表形式用于后续列表项展示。目前已通过jsonDecode(response.body)解析响应,可获取到data['RESPONSE']['GenericListAnswer']['ListNode']数据。
响应数据结构示例
"ListNode":[ { "id":"2", "mad_key":"32835", "is_custom":"0", "is_locked":"0", "is_inactive":"1", "run_hyperlink":{ "classid":"25510", "id":"2", "mad_key":"32835" }, "field":[ { "field_name":"code", "col_index":"1", "field_value":"LE-0000000002", "mad_key":"0", "id":"0" }, { "field_name":"common_desc_0", "col_index":"2", "field_value":"test_01", "mad_key":"0", "id":"0" }, { "field_name":"id_Org", "col_index":"3", "field_value":"01_01_04_01_SA - Shah Alam", "mad_key":"100377", "id":"100055" }, { "field_name":"dateReported", "col_index":"4", "field_value":"18/09/2020", "mad_key":"0", "id":"0" } ] } ]
当前代码
final data = jsonDecode(response.body); print(data['RESPONSE']['GenericListAnswer']['ListNode']);
解决方案
1. 基础提取方式(生成Map列表)
直接遍历ListNode,提取每个节点中run_hyperlink的目标字段,生成Map列表:
final data = jsonDecode(response.body); // 获取ListNode数组 final List<dynamic> listNodes = data['RESPONSE']['GenericListAnswer']['ListNode']; // 提取指定字段生成新列表 final List<Map<String, String>> hyperlinkList = listNodes.map((node) { final Map<String, dynamic> runHyperlink = node['run_hyperlink']; return { 'classid': runHyperlink['classid'], 'id': runHyperlink['id'], 'mad_key': runHyperlink['mad_key'], }; }).toList(); // 验证结果 print(hyperlinkList);
2. 空安全处理
如果run_hyperlink可能为null,可添加空判断避免异常:
final data = jsonDecode(response.body); final List<dynamic> listNodes = data['RESPONSE']['GenericListAnswer']['ListNode']; final List<Map<String, String>?> hyperlinkList = listNodes.map((node) { final dynamic runHyperlink = node['run_hyperlink']; if (runHyperlink == null) { // 此处可返回默认值或null,后续过滤 return null; } return { 'classid': runHyperlink['classid'], 'id': runHyperlink['id'], 'mad_key': runHyperlink['mad_key'], }; }) .where((item) => item != null) // 过滤掉null项 .toList();
3. 转换为实体类(规范开发)
定义实体类来封装数据,更利于后续维护:
class Hyperlink { final String classid; final String id; final String madKey; Hyperlink({ required this.classid, required this.id, required this.madKey, }); // 从Map转换为实体对象 factory Hyperlink.fromMap(Map<String, dynamic> map) { return Hyperlink( classid: map['classid'] as String, id: map['id'] as String, madKey: map['mad_key'] as String, ); } }
然后转换列表:
final data = jsonDecode(response.body); final List<dynamic> listNodes = data['RESPONSE']['GenericListAnswer']['ListNode']; final List<Hyperlink?> hyperlinkList = listNodes.map((node) { final Map<String, dynamic>? runHyperlink = node['run_hyperlink']; if (runHyperlink == null) return null; return Hyperlink.fromMap(runHyperlink); }) .where((item) => item != null) .toList();
内容的提问来源于stack exchange,提问作者JoshuaaMarkk
相关产品推荐
相关产品推荐

