'How to map data if the key is numeric in flutter

I am getting a response as key as numeric. How to map data for the following response

{
  "1": [
    {
      "id": 6,
      "name": "test 1"
    },
    {
      "id": 8,
      "name": "test 2"
    },
    {
      "id": 7,
      "name": "test 3"
    }
  ],
  "2": [
    {
      "id": 9,
      "name": "ttt1"
    },
    {
      "id": 5,
      "name": "ttt3"
    }
  ],
  "3": [
    {
      "id": 4,
      "name": "ttg",
      "status_id": 1
    }
  ]
}

Here is my model

import 'dart:convert';

Map<String, List<HomeBannerModel>> homeBannerModelFromJson(String str) => Map.from(json.decode(str)).map((k, v) => MapEntry<String, List<HomeBannerModel>>(k, List<HomeBannerModel>.from(v.map((x) => HomeBannerModel.fromJson(x)))));

String homeBannerModelToJson(Map<String, List<HomeBannerModel>> data) => json.encode(Map.from(data).map((k, v) => MapEntry<String, dynamic>(k, List<dynamic>.from(v.map((x) => x.toJson())))));
class HomeBannerModel {
  int id;
  String name;


  HomeBannerModel({this.id, this.name});

  HomeBannerModel.fromJson(Map<String, dynamic> json) {
    id = json['id'];
    name= json['name'];
 
  }

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

I need to take the value in UI as

 var data1 = data['1'];
var data2= data['2'];
var data3= data['3'];

but I am getting errors. help how to get the data of each key in each of the variable

but while mapping I am getting errors I have added part of my code in UI

_message:"type 'Map<String, dynamic>' is not a subtype of type 'List'"



Solution 1:[1]

The following method will convert your json string to a valid map object so that you can get your data the way you wanted.

Map<String, List<HomeBannerModel>> homeBannerModelFromJson(String str) => Map.from(json.decode(str)).map((k, v) => MapEntry<String, List<HomeBannerModel>>(k, List<HomeBannerModel>.from(v.map((x) => HomeBannerModel.fromJson(x)))));

to access data

final data = homeBannerModelFromJson(your_json_string);
print(data['1'][0].name); // test 1

Solution 2:[2]

You current json structure is Map<String, List<Map<String, dynamic>>> You can try something like

var json = {...};
json.forEach((key, list) {
    list.forEach((homeBannerModelMap) {
        HomeBannerModel hBM = HomeBannerModel.fromJson(homeBannerModelMap);
    });
});

Solution 3:[3]

You getting the error because your data is the type of Map, not the List. So you can do something like this:

// [data] is result banners
List data = []; 

// [result] is your object variable {"1": [{"id": 1, "name": "Welcome!"}]} etc
// So .forEach method is used for iterating through your json object

result.forEach((k, v){

  // in which iteration I will map every instance to List of [HomeBannerModel]
  
  var value = v.map((banner) => HomeBannerModel.fromJson(banner)).toList();

  //in result I will add the result to our [banners] List

  data.add(value);
});

But in this case, you should do:

data1 = data[1] // use int as the key, result will be List of BannerModels [Instance of 'HomeBannerModel', Instance of 'HomeBannerModel']

instead of:

var data1 = data['1']; //use string as the key

Solution 4:[4]

Please try the following code with just one model 'HomeBannerModel'.

main() {
  final Map<String, dynamic> json = {
    "1": [
      {"id": 6, "name": "test 1"},
      {"id": 8, "name": "test 2"},
      {"id": 7, "name": "test 3"}
    ],
    "2": [
      {"id": 9, "name": "ttt1"},
      {"id": 5, "name": "ttt3"}
    ],
    "3": [
      {"id": 4, "name": "ttg", "status_id": 1}
    ]
  };

  final Map datas = {};
  json.forEach((key, value) {
    datas.addAll(
        {"$key": value.map((ele) => HomeBannerModel.fromMap(ele)).toList()});
  });

  print(datas["1"]);
  print(datas["2"]);
  print(datas["3"]);
}

class HomeBannerModel {
  final int id;
  final String name;
  final int status_id;
  HomeBannerModel({
    this.id,
    this.name,
    this.status_id,
  });

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'status_id': status_id,
    };
  }

  factory HomeBannerModel.fromMap(map) {
    if (map == null) return null;

    return HomeBannerModel(
      id: map['id'],
      name: map['name'],
      status_id: map['status_id'],
    );
  }

  @override
  String toString() => 'Details(id: $id, name: $name, status_id: $status_id)';
}

You may also try with two models (1) Data and (2) HomeBannerModel. Please see the following code :

main() {
  final Map<String, dynamic> json = {
    "1": [
      {"id": 6, "name": "test 1"},
      {"id": 8, "name": "test 2"},
      {"id": 7, "name": "test 3"}
    ],
    "2": [
      {"id": 9, "name": "ttt1"},
      {"id": 5, "name": "ttt3"}
    ],
    "3": [
      {"id": 4, "name": "ttg", "status_id": 1}
    ]
  };

  final List<Data> data = [];
  json.forEach((key, value) {
    data.add(Data.fromMap({"id": key, "details": value}));
  });

  print(data.firstWhere((e) => e.dataID == '1').homeBannerModel);
  print(data.firstWhere((e) => e.dataID == '2').homeBannerModel);
  print(data.firstWhere((e) => e.dataID == '3').homeBannerModel);
}

class Data {
  final String dataID;
  final List<HomeBannerModel> homeBannerModel;
  Data({
    this.dataID,
    this.homeBannerModel,
  });

  factory Data.fromMap(Map<String, dynamic> map) {
    if (map == null) return null;
    return Data(
        dataID: map["id"],
        homeBannerModel: (map["details"]
            .map<HomeBannerModel>((ele) => HomeBannerModel.fromMap(ele))
            .toList() as List<HomeBannerModel>));
  }

  @override
  String toString() => 'Data(id: $dataID, details: $homeBannerModel)';
}

class HomeBannerModel {
  final int id;
  final String name;
  final int status_id;
  HomeBannerModel({
    this.id,
    this.name,
    this.status_id,
  });

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'status_id': status_id,
    };
  }

  factory HomeBannerModel.fromMap(map) {
    if (map == null) return null;

    return HomeBannerModel(
      id: map['id'],
      name: map['name'],
      status_id: map['status_id'],
    );
  }

  @override
  String toString() => 'Details(id: $id, name: $name, status_id: $status_id)';
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 dm_tr
Solution 3 erknvl
Solution 4