You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:42:25