Flutter中如何读取本地嵌套JSON文件的内层值?
解决Flutter读取嵌套JSON内层数据的问题
问题根源
你的JSON是嵌套结构:外层是包含id、created、raw_data数组的对象列表,measurement_id、index等目标字段都在raw_data的子对象里。但你当前的UserModel错误地把内外层字段混在一起,完全没处理raw_data这个嵌套数组,所以拿不到内层数据。
修正方案
拆分模型类,分别对应外层对象和内层的raw_data对象,再正确解析嵌套结构。
1. 重新定义模型类
创建两个模型,分别匹配JSON的层级结构:
// 外层模型:对应JSON中的每个顶级对象 class MeasurementRecord { late int id; late String created; late List<RawData> rawData; MeasurementRecord({ required this.id, required this.created, required this.rawData, }); MeasurementRecord.fromJson(Map<String, dynamic> json) { id = json['id']; created = json['created']; // 解析raw_data数组,转换为RawData对象列表 rawData = (json['raw_data'] as List) .map((item) => RawData.fromJson(item)) .toList(); } } // 内层模型:对应raw_data中的每个子对象 class RawData { late int measurementId; late int index; late int substance; late int pressure; late double temperature; RawData({ required this.measurementId, required this.index, required this.substance, required this.pressure, required this.temperature, }); RawData.fromJson(Map<String, dynamic> json) { measurementId = json['measurement_id']; index = json['index']; substance = json['substance']; pressure = json['pressure']; temperature = json['temperature'].toDouble(); } }
2. 修改JSON读取逻辑
更新handler,让它返回新的MeasurementRecord列表:
import 'dart:convert'; import 'package:flutter/services.dart' as rootbundle; import '../model/measurement_model.dart'; // 导入新模型文件 Future<List<MeasurementRecord>> readJsonData() async { final jsondata = await rootbundle.rootBundle.loadString('/userdata.json'); final list = json.decode(jsondata) as List<dynamic>; return list.map((e) => MeasurementRecord.fromJson(e)).toList(); }
3. 使用示例
现在可以正常获取内层数据,比如:
// 读取数据并打印内层示例 void fetchData() async { List<MeasurementRecord> records = await readJsonData(); // 打印第一条记录的第一条raw_data数据 RawData firstRawData = records[0].rawData[0]; print('measurement_id: ${firstRawData.measurementId}'); print('temperature: ${firstRawData.temperature}'); }
关键说明
- 嵌套JSON解析的核心是按层级对应创建模型,外层对象包含内层对象的列表,解析时需遍历内层数组并转换为对应模型实例。
- 注意JSON字段名和模型属性名的映射(比如
raw_data转rawData、measurement_id转measurementId),保持命名规范的同时确保对应关系正确。
内容的提问来源于stack exchange,提问作者Battleaxe
相关产品推荐
相关产品推荐

