【问题标题】:How to get the values from a nested Map?如何从嵌套地图中获取值?
【发布时间】:2020-04-02 07:09:05
【问题描述】:

Flutter 的新手,从 json 响应中,我想简单地获取值。

JSON 响应示例:

{
  "success": true,
  "kits": {
    "Kit One": {
      "area": "area one"
    },
    "Kit Two": {
      "area": "area two"
    },
    "Kit Three": {
      "area": "area three"
    },
    "Kit Four": {
      "area": "area four"
    },
    "Kit Five": {
      "area": "area five"
    },
    "Kit Six": {
      "area": "area six"
    },
    "Kit Seven": {
      "area": "area seven"
    },
    "Kit Eight": {
      "area": "area eight"
    },
    "Kit Nine": {
      "area": "area nine"
    },
    "Kit Ten": {
      "area": "area ten"
    }
  }
}

QuickType - JSON 到 Dart

import 'dart:convert';

Kits kitsFromJson(String str) => Kits.fromJson(json.decode(str));

String kitsToJson(Kits data) => json.encode(data.toJson());

class Kits {
    bool success;
    Map<String, Kit> kits;

    Kits({
        this.success,
        this.kits,
    });

    factory Kits.fromJson(Map<String, dynamic> json) => Kits(
        success: json["success"] == null ? null : json["success"],
        kits: json["kits"] == null ? null : Map.from(json["kits"]).map((k, v) => MapEntry<String, Kit>(k, Kit.fromJson(v))),
    );

    Map<String, dynamic> toJson() => {
        "success": success == null ? null : success,
        "kits": kits == null ? null : Map.from(kits).map((k, v) => MapEntry<String, dynamic>(k, v.toJson())),
    };enter code here
}

class Kit {
    String area;

    Kit({
        this.area,
    });

    factory Kit.fromJson(Map<String, dynamic> json) => Kit(
        area: json["area"] == null ? null : json["area"],
    );

    Map<String, dynamic> toJson() => {
        "area": area == null ? null : area,
    };
}

问题:

鉴于我上面的内容,我已经想出了如何获取诸如“套件一”、“套件二”等值。但不幸的是,我对如何获得诸如“区域一”之类的值有点困惑, '区域二', 等等。

其他信息: “套件一”、“套件二”、“套件三”等将显示为列表,选择一行会将其值(“区域一”或“区域二”等)发送到下一页。

非常感谢您并感谢您的所有帮助。愿原力与你同在! :)

【问题讨论】:

  • 您是否在此处发布了完整代码?或者还有其他一些代码,也许你忘记发布了。 :-)
  • javiercbk.github.io/json_to_dart ... 在此处发布您的 JSON,它将为此生成一些飞镖代码。我希望你会从中得到清晰的想法。 :-)
  • 不确定您的问题是什么?在我看来,您的 JSON 解析有效,所以在解析 json 后如何导航数据结构的问题更多吗?例如。我可以通过运行kitsObject.kits.values.forEach((kit) =&gt; print(kit.area)); 获取区域列表,其中kitsObjectkitsFromJson 的输出
  • 谢谢julemand101,这就是我要找的东西.. :) 我怎么能在这里指出你的解决方案解决了我的问题?再次感谢!! :)
  • 也感谢 Ratnadeep Chakraborty,尽管这与 Akash Kashyap 的建议相同,但会保留此信息以供将来参考。

标签: json dictionary parsing flutter dart


【解决方案1】:

我对此的看法是使用这个库 https://github.com/k-paxian/dart-json-mapper 将您的 json 映射到您的 Dart 类。

它将允许你拥有一个干净整洁的模型代码,没有fromJson/toJson 硬编码样板,没有嵌入文字。

如果您的项目中有多个模型类,则使用现成的解决方案可以进一步节省您的工作量。

@jsonSerializable
class Kit {
  String area;
}

@jsonSerializable
class Kits {

  final Map<String, dynamic> _kitsMap = {};

  @jsonProperty
  void setKit(String name, dynamic value) {
    _kitsMap[name] = JsonMapper.fromMap<Kit>(value);
  }

  @jsonProperty
  Map<String, dynamic> getMap() {
    return _kitsMap;
  }
}

@jsonSerializable
class Response {
  bool success;
  Kits kits;
}

// here is the input json

      final json = '''
{
  "success": true,
  "kits": {
    "Kit One": {
      "area": "area one"
    },
    "Kit Two": {
      "area": "area two"
    },
    "Kit Three": {
      "area": "area three"
    },
    "Kit Four": {
      "area": "area four"
    },
    "Kit Five": {
      "area": "area five"
    },
    "Kit Six": {
      "area": "area six"
    },
    "Kit Seven": {
      "area": "area seven"
    },
    "Kit Eight": {
      "area": "area eight"
    },
    "Kit Nine": {
      "area": "area nine"
    },
    "Kit Ten": {
      "area": "area ten"
    }
  }
} ''';

  // Now you have an response model instance populated from json in one line of code
  final responseInstance = JsonMapper.deserialize<Response>(json);

  // Now you have a model instance back to json in one line of code
  print(JsonMapper.serialize(responseInstance));

控制台输出将是

{
 "success": true,
 "kits": {
  "Kit One": {
   "area": "area one"
  },
  "Kit Two": {
   "area": "area two"
  },
  "Kit Three": {
   "area": "area three"
  },
  "Kit Four": {
   "area": "area four"
  },
  "Kit Five": {
   "area": "area five"
  },
  "Kit Six": {
   "area": "area six"
  },
  "Kit Seven": {
   "area": "area seven"
  },
  "Kit Eight": {
   "area": "area eight"
  },
  "Kit Nine": {
   "area": "area nine"
  },
  "Kit Ten": {
   "area": "area ten"
  }
 }
}

【讨论】:

  • 谢谢 Alexander,julemand101 的建议解决了我的问题。将保留此内容以供将来参考。 :)
【解决方案2】:

你可以使用这个 JSON 来 Dart -->

class MainKits {
  bool success;
  Kits kits;

  MainKits({this.success, this.kits});

  MainKits.fromJson(Map<String, dynamic> json) {
    success = json['success'];
    kits = json['kits'] != null ? new Kits.fromJson(json['kits']) : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['success'] = this.success;
    if (this.kits != null) {
      data['kits'] = this.kits.toJson();
    }
    return data;
  }
}

class Kits {
  KitOne kitOne;
  KitOne kitTwo;
  KitOne kitThree;
  KitOne kitFour;
  KitOne kitFive;
  KitOne kitSix;
  KitOne kitSeven;
  KitOne kitEight;
  KitOne kitNine;
  KitOne kitTen;

  Kits(
      {this.kitOne,
      this.kitTwo,
      this.kitThree,
      this.kitFour,
      this.kitFive,
      this.kitSix,
      this.kitSeven,
      this.kitEight,
      this.kitNine,
      this.kitTen});

  Kits.fromJson(Map<String, dynamic> json) {
    kitOne =
        json['Kit One'] != null ? new KitOne.fromJson(json['Kit One']) : null;
    kitTwo =
        json['Kit Two'] != null ? new KitOne.fromJson(json['Kit Two']) : null;
    kitThree = json['Kit Three'] != null
        ? new KitOne.fromJson(json['Kit Three'])
        : null;
    kitFour =
        json['Kit Four'] != null ? new KitOne.fromJson(json['Kit Four']) : null;
    kitFive =
        json['Kit Five'] != null ? new KitOne.fromJson(json['Kit Five']) : null;
    kitSix =
        json['Kit Six'] != null ? new KitOne.fromJson(json['Kit Six']) : null;
    kitSeven = json['Kit Seven'] != null
        ? new KitOne.fromJson(json['Kit Seven'])
        : null;
    kitEight = json['Kit Eight'] != null
        ? new KitOne.fromJson(json['Kit Eight'])
        : null;
    kitNine =
        json['Kit Nine'] != null ? new KitOne.fromJson(json['Kit Nine']) : null;
    kitTen =
        json['Kit Ten'] != null ? new KitOne.fromJson(json['Kit Ten']) : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.kitOne != null) {
      data['Kit One'] = this.kitOne.toJson();
    }
    if (this.kitTwo != null) {
      data['Kit Two'] = this.kitTwo.toJson();
    }
    if (this.kitThree != null) {
      data['Kit Three'] = this.kitThree.toJson();
    }
    if (this.kitFour != null) {
      data['Kit Four'] = this.kitFour.toJson();
    }
    if (this.kitFive != null) {
      data['Kit Five'] = this.kitFive.toJson();
    }
    if (this.kitSix != null) {
      data['Kit Six'] = this.kitSix.toJson();
    }
    if (this.kitSeven != null) {
      data['Kit Seven'] = this.kitSeven.toJson();
    }
    if (this.kitEight != null) {
      data['Kit Eight'] = this.kitEight.toJson();
    }
    if (this.kitNine != null) {
      data['Kit Nine'] = this.kitNine.toJson();
    }
    if (this.kitTen != null) {
      data['Kit Ten'] = this.kitTen.toJson();
    }
    return data;
  }
}

class KitOne {
  String area;

  KitOne({this.area});

  KitOne.fromJson(Map<String, dynamic> json) {
    area = json['area'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['area'] = this.area;
    return data;
  }
}

现在你可以访问所有你想要的变量了。

如果我帮助了你,请给我打分。

【讨论】:

  • 感谢您的及时回复。欣赏它。我认为我将来使用这种方法会遇到的问题是当 json 响应发生变化时,比如它上面会有更多数据,比如说 35 加,我不确定这是否是最佳实践。跨度>
  • 感谢您给我宝贵的反馈。我能知道为什么当数据更多时这种方法不起作用......假设数据将超过 1000,那么问题将是什么。
  • 嘿,阿卡什,我忘了在我的问题中添加它将显示在列表中(请参阅我更新的问题 - 附加信息),它不起作用的唯一原因是我的领导不'不喜欢那个实现,因为它以前是由某人实现的。再次感谢您。
  • @Akash Kashyap。您的解决方案是糟糕的软件设计,因为它根本无法扩展。像 KitOne kitOne; KitOne kitTwo; KitOne kitThree; 那样将每个 Kit 表示为变量是没有意义的。相反,应该使用带有 List 或 Map 的解决方案,以便您可以迭代 Kit。
  • @julemand101 正如 Ayna 所说,我不知道他想使用列表来代表这些套件。但感谢您的反馈。现在我知道我的错误,我会在以后的代码中解决这个问题。再次感谢。
猜你喜欢
  • 2020-12-31
  • 2021-10-03
  • 2011-10-10
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2014-03-13
相关资源
最近更新 更多