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

Flutter如何解析指定JSON提取问题填充Question模型列表

Flutter 答题应用JSON解析替换硬编码数据实现方案

实现步骤

1. 补全Question模型的序列化方法

首先确认你的Question模型类存在fromJson构造方法,用于将解码后的Map数据转换为模型实例,单题3分钟的计时规则可以直接在模型里配置默认值,避免重复赋值。
示例代码(对应引入路径package:activepeers_app_internship/models/questions.dart):

class Question {
  // 以下字段替换为你项目中Question类的实际属性
  final String questionId;
  final String title;
  final List<String> options;
  final String correctAnswer;
  final int answerDuration; // 单题答题时长,单位秒

  Question({
    required this.questionId,
    required this.title,
    required this.options,
    required this.correctAnswer,
    this.answerDuration = 180, // 默认3分钟=180秒,匹配业务规则
  });

  factory Question.fromJson(Map<String, dynamic> json) {
    // 以下字段key要和你实际JSON里的字段名对应
    return Question(
      questionId: json['questionId'].toString(),
      title: json['title'] as String,
      options: List<String>.from(json['options'] as List),
      correctAnswer: json['correctAnswer'].toString(),
      answerDuration: json['answerDuration'] ?? 180,
    );
  }
}

2. 编写核心解析逻辑

源数据是数组格式,直接跳过索引为3的第4项内容,取索引为2的字符串做二次解码,再按照业务规则截取题量:总共2轮、每轮最多10题,也就是总题量最多取20道。
解析逻辑要加异常捕获,避免JSON格式不合法导致应用崩溃:

import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:activepeers_app_internship/models/questions.dart';

List<Question> parseQuestionList(dynamic rawSourceArray) {
  List<Question> validQuestions = [];
  try {
    // 先校验源数据格式合法性
    if (rawSourceArray is! List || rawSourceArray.length < 3) {
      throw const FormatException('源JSON数组长度不足,无法读取目标位置数据');
    }

    // 取索引2的字符串内容做二次解码,自动忽略索引3的第4项
    final String nestedJsonString = rawSourceArray[2] as String;
    final dynamic nestedQuestionData = jsonDecode(nestedJsonString);

    if (nestedQuestionData is! List) {
      throw const FormatException('目标位置的嵌套内容不是合法的问题数组');
    }

    // 按业务规则截断:最多取2*10=20道题
    const int maxQuestionCount = 20;
    for (final item in nestedQuestionData.take(maxQuestionCount)) {
      if (item is Map<String, dynamic>) {
        validQuestions.add(Question.fromJson(item));
      }
    }

    return validQuestions;
  } catch (err) {
    // 解析异常兜底:可根据业务需要返回空列表,或者保留部分原有测试数据
    debugPrint('问题数据解析失败: $err');
    return [];
  }
}

3. 替换原有硬编码数据

找到项目中原来定义List<Question> sample_data的位置,删除硬编码的测试数据,在页面初始化逻辑(比如initState生命周期、状态管理类的初始化方法)中,调用上面的parseQuestionList方法传入原始JSON数据源,将返回的Question实例列表赋值给原来的sample_data变量即可直接供页面渲染使用。
如果需要拆分两个轮次的题目,直接对解析后的列表做切片即可:

// 解析完成后拆分轮次
final List<Question> firstRoundQuestions = sample_data.take(10).toList();
final List<Question> secondRoundQuestions = sample_data.skip(10).take(10).toList();

注意事项

  • 如果你的JSON字段名和模型属性名不匹配,可以在fromJson方法里做key映射,或者引入json_serializable等序列化库自动生成转换逻辑减少手写错误。
  • 解析逻辑里的异常捕获不要删除,线上环境如果遇到格式错误的数据源不会直接闪退。
  • 单题计时器直接读取Question实例里的answerDuration字段即可,不需要额外配置时长。

内容的提问来源于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 15:09:19