Dart/Flutter 如何解析包含两层嵌套对象的JSON数据
Flutter 双层嵌套JSON结构解析实现方案
你给出的JSON结构包含两层对象嵌套,最外层NewDataSet为对象类型,其内部Route字段为路线对象数组,以下是两种可直接落地的解析方案:
方案1:手动解析(轻量场景首选,无需额外生成代码)
步骤1:定义对应层级的数据模型
// 对应Route数组里的单个路线对象 class RouteItem { final String routeId; final String routeNum; final String description; RouteItem({ required this.routeId, required this.routeNum, required this.description, }); // 从Map构造实体 factory RouteItem.fromJson(Map<String, dynamic> json) { return RouteItem( routeId: json['RouteID'] as String, routeNum: json['RouteNum'] as String, description: json['Description'] as String, ); } } // 对应NewDataSet对象层 class NewDataSet { final List<RouteItem> routes; NewDataSet({required this.routes}); factory NewDataSet.fromJson(Map<String, dynamic> json) { // 先把Route数组转成List<RouteItem> var routeList = json['Route'] as List; List<RouteItem> items = routeList.map((i) => RouteItem.fromJson(i)).toList(); return NewDataSet(routes: items); } } // 最外层JSON根对象 class RootResponse { final NewDataSet newDataSet; RootResponse({required this.newDataSet}); factory RootResponse.fromJson(Map<String, dynamic> json) { return RootResponse( newDataSet: NewDataSet.fromJson(json['NewDataSet']), ); } }
步骤2:调用解析逻辑
import 'dart:convert'; // 你的JSON字符串 String jsonString = ''' { "NewDataSet": { "Route": [ { "RouteID": "1", "RouteNum": "20", "Description": "NORTH DAKOTA " }, { "RouteID": "11", "RouteNum": "25", "Description": "East SD " } ] } } '''; // 解析执行代码 void parseJson() { // 先把JSON字符串转成Map Map<String, dynamic> jsonMap = jsonDecode(jsonString); // 逐层解析得到最终实体 RootResponse response = RootResponse.fromJson(jsonMap); // 直接使用解析后的数据,示例:打印第一条路线的编号 print(response.newDataSet.routes[0].routeNum); }
方案2:json_serializable 自动解析(适合复杂业务场景,减少手动编码错误)
步骤1:添加依赖
在pubspec.yaml中添加以下依赖:
dependencies: flutter: sdk: flutter json_annotation: ^4.8.1 dev_dependencies: flutter_test: sdk: flutter build_runner: ^2.4.4 json_serializable: ^6.7.0
添加后执行flutter pub get拉取依赖。
步骤2:编写带注解的模型类
import 'package:json_annotation/json_annotation.dart'; part 'route_data.g.dart'; // 生成的代码文件名,和当前文件同名加.g后缀 @JsonSerializable() class RouteItem { @JsonKey(name: 'RouteID') final String routeId; @JsonKey(name: 'RouteNum') final String routeNum; @JsonKey(name: 'Description') final String description; RouteItem({ required this.routeId, required this.routeNum, required this.description, }); factory RouteItem.fromJson(Map<String, dynamic> json) => _$RouteItemFromJson(json); Map<String, dynamic> toJson() => _$RouteItemToJson(this); } @JsonSerializable() class NewDataSet { @JsonKey(name: 'Route') final List<RouteItem> routes; NewDataSet({required this.routes}); factory NewDataSet.fromJson(Map<String, dynamic> json) => _$NewDataSetFromJson(json); Map<String, dynamic> toJson() => _$NewDataSetToJson(this); } @JsonSerializable() class RootResponse { @JsonKey(name: 'NewDataSet') final NewDataSet newDataSet; RootResponse({required this.newDataSet}); factory RootResponse.fromJson(Map<String, dynamic> json) => _$RootResponseFromJson(json); Map<String, dynamic> toJson() => _$RootResponseToJson(this); }
步骤3:生成解析代码
在项目根目录执行命令:flutter pub run build_runner build
工具会自动生成对应的序列化解析代码。
步骤4:调用解析
和手动解析的调用逻辑完全一致,直接用RootResponse.fromJson(jsonMap)即可得到解析后的实体。
内容的提问来源于stack exchange,提问作者Alexander Callender
相关产品推荐
相关产品推荐

