Flutter解析嵌套JSON报String/Null类型错误解决方案
错误根因
- 类型匹配错误:接口返回数组第三项的转义JSON反序列化后,得到的是键为字符串
"0"、"1"的Map结构,不是下标为数字的List结构。代码中用数字下标data1[0]取值时,Dart的Map不会自动将数字0转换为字符串"0"做键匹配,直接返回null,后续逻辑尝试把null赋值给String类型的字段时,就会抛出Expected a value of type 'String', but got one of type 'Null'错误。 - 存在冗余操作:二次
jsonDecode拿到反馈数据对象后,额外做json.encode转字符串、再jsonDecode转对象的操作完全多余,既浪费性能,也可能因特殊字符转义引入不必要的解析异常。
正确实现代码
import 'dart:convert'; import 'package:http/http.dart' as http; // 问题模型类 class Question { final int questionIndex; final String content; Question({required this.questionIndex, required this.content}); } Future<List<Question>> fetchFirstGroupQuestions() async { // 发起GET请求 final resp = await http.get(Uri.parse('替换为实际业务接口地址')); if (resp.statusCode != 200) { throw Exception('接口请求失败,状态码:${resp.statusCode}'); } // 第一层解析:响应根结构为数组 List<dynamic> rootArr = jsonDecode(resp.body) as List; if (rootArr.length < 4) { throw Exception('接口返回结构异常,数组长度不符合约定'); } // 二次解析第三项转义JSON,结果为Map类型,键是字符串"0"/"1" Map<String, dynamic> feedbackData = jsonDecode(rootArr[2] as String) as Map<String, dynamic>; // 取第一组反馈数据:必须用字符串键"0"取值,不能用数字下标0 Map<String, dynamic> firstGroup = feedbackData["0"] as Map<String, dynamic>; List<Question> result = []; // 遍历提取question1-question10字段 for (int i = 1; i <= 10; i++) { String fieldKey = "question$i"; String? content = firstGroup[fieldKey] as String?; // 空值兜底,避免字段缺失触发崩溃 if (content != null) { result.add(Question(questionIndex: i, content: content)); } } // 如需取feedback_id、timer配置,直接从firstGroup中按键取值即可 // 如需解析第四项题库,调用jsonDecode(rootArr[3] as String)即可 return result; }
避坑说明
- 多层JSON解析后,可通过打印变量的
runtimeType确认实际结构,不要靠主观臆断判断是Map还是List。 - 解析接口字段时必须做空安全兜底,不要默认所有字段一定存在、类型一定符合预期,避免后端字段缺失或类型调整导致运行时崩溃。
- 非必要不要做重复的JSON序列化/反序列化操作,
jsonDecode本身已经完成了字符串到Dart原生类型的转换,重复操作无任何收益。
内容的提问来源于stack exchange,提问作者unknownCoder
相关产品推荐
相关产品推荐

