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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:57:04