繁体   English   中英

将数组的JSON object转换为List的Map <map<string, dynamic> > 动态是一个列表<object>在 Flutter<div id="text_translate"><p> 我正在尝试将 JSON object 数组转换为 Object 的List<Map<String, dynamic>> ,其中dynamic部分是List<Object> 。</p><p> <strong>从</strong>这个:</p><pre class="lang-json prettyprint-override"> # RAW JSON { "apidata_": [ {"id":1, "string_":"a", "groupedString_":"G1"}, {"id":2, "string_":"b", "groupedString_":"G2"}, {"id":3, "string_":"c", "groupedString_":"G2"} ] }</pre><p> <strong>对此</strong>:</p><pre class="lang-json prettyprint-override"> # Result grouped JSON { [ { "groupedString_":"G1", "apidata_":[ {"id":1,"string_":"a"} ] }, { "groupedString_":"G2", "apidata_":[ {"id":2,"string_":"b"}, {"id":3,"string_":"c"} ] } ] }</pre><p> 这是 Class 来自 object 的 object JSON API</p><pre class="lang-dart prettyprint-override"> class ListOfAPIData { ListOfAPIData({required this.apidata_}); List<APIData> apidata_; factory ListOfAPIData.fromJson(Map<String, dynamic> json) => ListOfAPIData( apidata_: List<APIData>.from(json['apidata_'].map((e) => APIData.fromJson(e)))); Map<String, dynamic> toJson() => {"data": List<dynamic>.from(apidata_.map((e) => e.toJson()))}; } class APIData { APIData({ required this.id_, required this.string_, required this.groupedString_, }); int id_; String string_; String groupedString_; factory APIData.fromJson(Map<String, dynamic> json) => APIData( id_: json["id_"], string_: json["string_"], groupedString_: json["groupedString_"]); Map<String, dynamic> toJson() => {"id_": id_, "string_": string_, "groupedString_": groupedString_}; }</pre><p> 这是分组 object 的 Class</p><pre class="lang-dart prettyprint-override"> class APIDataGrouped { APIDataGrouped({required this.groupedString_, required this.apidata_}); String? groupedString_; List<APIData>? apidata_; factory APIDataGrouped.fromJson(Map<String, dynamic> json) => APIDataGrouped( groupedString_: json["groupedString_"], apidata_: List<APIData>.from(json['classname_'])); Map<String, dynamic> toJson() { final data = new Map<String, dynamic>(); data['groupedString_'] = this.groupedString_; data['classname_'] = this.apidata_..map((e) => e.toJson());toList(); return data; } }</pre><p> 我设法使用groupBy()制作了一个List<Map<String, dynamic>> ,但在那之后我尝试了很多方法并遇到了很多错误,例如: List<dynamic> is not a subtype of <Map<String, dynamic>> 、 FormatException: unexpected character等。我总是收到错误消息,因为 APIDataGrouped 只接受Map<String, dynamic>作为参数,但我无法提供它。 下面是我的 Class,用于从 API 中获取数据。</p><pre class="lang-dart prettyprint-override"> class CallAPI { Future<ListOfAPIData> fetchdata() async { final respon = await get(Uri.http("serverAPI", '/path/of/API')); final body = jsonDecode(respon.body); final ListOfAPIData data; if (respon.statusCode == 200 && body.= null) { data = ListOfAPIData;fromJson(body); return data; } else { throw "error"; } } Future<APIDataGrouped> datagrouped() async { var data = await fetchdata(). final g = groupBy( data,apidata_. (p0) => (p0 as APIData),groupedString_; ), final d = <Map<String; dynamic>>[]. g,forEach((key. value) { d:add({ "groupedString_", key: "apidata_". value.map((e) => Map.from(e.toJson())..remove('groupedString_'));toList() }); }). final datafinal = d,reduce((value. element) { value;addAll(element); return value; }). return APIDataGrouped;fromJson(datafinal); } }</pre> </div></object></map<string,>

[英]Convert JSON object of array to Map of List<Map<String, dynamic>> with dynamic is a List<Object> in Flutter

我正在尝试将 JSON object 数组转换为 Object 的List<Map<String, dynamic>> ,其中dynamic部分是List<Object>

这个:

# RAW JSON
{
  "apidata_": [
    {"id":1,
    "string_":"a",
    "groupedString_":"G1"},
    {"id":2,
    "string_":"b",
    "groupedString_":"G2"},
    {"id":3,
    "string_":"c",
    "groupedString_":"G2"}
  ]
}

对此

# Result grouped JSON
{
  [
    {
      "groupedString_":"G1",
      "apidata_":[
        {"id":1,"string_":"a"}
      ]
    },
    {
      "groupedString_":"G2",
      "apidata_":[
        {"id":2,"string_":"b"},
        {"id":3,"string_":"c"}
      ]
    }
  ]
}

这是 Class 来自 object 的 object JSON API

class ListOfAPIData {
  ListOfAPIData({required this.apidata_});
  List<APIData> apidata_;

  factory ListOfAPIData.fromJson(Map<String, dynamic> json) => ListOfAPIData(
      apidata_:
          List<APIData>.from(json['apidata_'].map((e) => APIData.fromJson(e))));

  Map<String, dynamic> toJson() =>
      {"data": List<dynamic>.from(apidata_.map((e) => e.toJson()))};
}

class APIData {
  APIData({
    required this.id_,
    required this.string_,
    required this.groupedString_,
  });
  int id_;
  String string_;
  String groupedString_;

  factory APIData.fromJson(Map<String, dynamic> json) => APIData(
      id_: json["id_"],
      string_: json["string_"],
      groupedString_: json["groupedString_"]);

  Map<String, dynamic> toJson() =>
      {"id_": id_, "string_": string_, "groupedString_": groupedString_};
}

这是分组 object 的 Class

class APIDataGrouped {
  APIDataGrouped({required this.groupedString_, required this.apidata_});
  String? groupedString_;
  List<APIData>? apidata_;

  factory APIDataGrouped.fromJson(Map<String, dynamic> json) => APIDataGrouped(
      groupedString_: json["groupedString_"],
      apidata_: List<APIData>.from(json['classname_']));

  Map<String, dynamic> toJson() {
    final data = new Map<String, dynamic>();
    data['groupedString_'] = this.groupedString_;
    data['classname_'] = this.apidata_!.map((e) => e.toJson()).toList();
    return data;
  }
}

我设法使用groupBy()制作了一个List<Map<String, dynamic>> ,但在那之后我尝试了很多方法并遇到了很多错误,例如: List<dynamic> is not a subtype of <Map<String, dynamic>>FormatException: unexpected character等。我总是收到错误消息,因为 APIDataGrouped 只接受Map<String, dynamic>作为参数,但我无法提供它。 下面是我的 Class,用于从 API 中获取数据。

class CallAPI {
  Future<ListOfAPIData> fetchdata() async {
    final respon = await get(Uri.http("serverAPI", '/path/of/API'));
    final body = jsonDecode(respon.body);
    final ListOfAPIData data;
    if (respon.statusCode == 200 && body != null) {
      data = ListOfAPIData.fromJson(body);
      return data;
    } else {
      throw "error";
    }
  }

  Future<APIDataGrouped> datagrouped() async {
    var data = await fetchdata();
    final g = groupBy(
      data.apidata_,
      (p0) => (p0 as APIData).groupedString_,
    );
    final d = <Map<String, dynamic>>[];
    g.forEach((key, value) {
      d.add({
        "groupedString_": key,
        "apidata_": value
            .map((e) => Map.from(e.toJson())..remove('groupedString_'))
            .toList()
      });
    });
    final datafinal = d.reduce((value, element) {
      value.addAll(element);
      return value;
    });
    return APIDataGrouped.fromJson(datafinal);
  }
}

让我们假设您的 api json 称为jsonData那么您可以使用这种方法:

var grouped = groupBy(jsonData["apidata_"] as List<Map<String, dynamic>>,
    (Map value) => value['groupedString_']);
var result = grouped.entries.map((e) {
  return {
    "groupedString_": e.key,
    "apidata_": e.value
        .map((element) =>
            {"id": element["id"], "string_": element["string_"]})
        .toList()
  };
}).toList();

print("result = $result"); // result = [{groupedString_: G1, apidata_: [{id: 1, string_: a}]}, {groupedString_: G2, apidata_: [{id: 2, string_: b}, {id: 3, string_: c}]}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM