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

如何解析嵌套JSON字典并转换为Flutter Dart中的Map结构

在Flutter中解析嵌套Map类型的JSON(对应Swift字典结构)

你说的这种嵌套字典结构的JSON解析其实很简单,和你已经掌握的数组解析思路是通的,只是把处理List的逻辑换成处理Map就行。咱们一步步来:

1. 定义子数据模型类

首先,先给每个tag对应的helpHdr和helpText定义一个模型类,比如叫HelpContent:

class HelpContent {
  final String helpHdr;
  final String helpText;

  HelpContent({required this.helpHdr, required this.helpText});

  // 从JSON解析成HelpContent实例的工厂构造函数
  factory HelpContent.fromJson(Map<String, dynamic> json) {
    return HelpContent(
      helpHdr: json['helpHdr'] as String,
      helpText: json['helpText'] as String,
    );
  }
}

2. 定义主模型类

接下来定义包含整个tag字典的主类,比如叫TagDictModel,里面的tagDict是一个Map<String, HelpContent>类型:

class TagDictModel {
  final Map<String, HelpContent> tagDict;

  TagDictModel({required this.tagDict});

  // 解析外层JSON的工厂构造函数
  factory TagDictModel.fromJson(Map<String, dynamic> json) {
    // 取出tagDict对应的Map,然后遍历每个键值对,把值转换成HelpContent实例
    final tagMap = json['tagDict'] as Map<String, dynamic>;
    Map<String, HelpContent> parsedTagDict = {};
    tagMap.forEach((key, value) {
      parsedTagDict[key] = HelpContent.fromJson(value as Map<String, dynamic>);
    });

    return TagDictModel(tagDict: parsedTagDict);
  }
}

3. 解析JSON并取值

现在你就可以把你的JSON字符串或者从文件/网络获取的JSON数据解析成模型,然后像你想要的那样取值了:

// 示例JSON字符串
String jsonString = '''
{ 
  "tagDict" : { 
    "abc" : { "helpHdr" : "short text1", "helpText" : "long text1" }, 
    "def" : { "helpHdr" : "short text2", "helpText" : "long text2" } 
  } 
}
''';

// 解析JSON
Map<String, dynamic> parsedJson = jsonDecode(jsonString);
TagDictModel myVariable = TagDictModel.fromJson(parsedJson);

// 取值,记得加?避免空指针
String? shortText1 = myVariable.tagDict["abc"]?.helpHdr; // 得到"short text1"
String? longText2 = myVariable.tagDict["def"]?.helpText; // 得到"long text2"

这样就完全实现了你想要的效果,和Swift里的字典用法逻辑一致,只是Dart里需要通过模型类来访问属性~

内容的提问来源于stack exchange,提问作者w461

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 20:27:31