Solved: Flutter - Create Map from two JSON

Question

Asked by Federico on December 27, 2021 (source).

I need to create a Map dictionary for this two JSON for creating a view like App Store/Play Store so, a view with cell grouped by different heading.

First JSON

[
   {
      "category_id":"1",
      "language_code":"it",
      "category_name":"punti d'interesse",
      "category_description":"descrizione",
      "is_hidden":"0"
   },
   {
      "category_id":"2",
      "language_code":"it",
      "category_name":"farmacie",
      "category_description":"desc farm",
      "is_hidden":"0"
   }
]

Second JSON

[
   {
      "poi_id":"1",
      "category_id":"1",
      "language_code":"it",
      "poi_name":"chiese",
      "poi_description":"",
      "poi_image":"church.jpg"
   },
   {
      "poi_id":"2",
      "category_id":"1",
      "language_code":"it",
      "poi_name":"monumenti",
      "poi_description":"",
      "poi_image":"monument.jpg"
   },
   {
      "poi_id":"3",
      "category_id":"2",
      "language_code":"it",
      "poi_name":"musei",
      "poi_description":"",
      "poi_image":"museum.jpg"
   }
]

How can I create?

Answer

Question answered by davdog00 (source).

Here you go:

import 'dart:convert';

void main() {
  // Your first json
  List<Map<String, String>> map1 = [
    {
      "category_id": "1",
      "language_code": "it",
      "category_name": "punti d'interesse",
      "category_description": "descrizione",
      "is_hidden": "0"
    },
    {
      "category_id": "2",
      "language_code": "it",
      "category_name": "farmacie",
      "category_description": "desc farm",
      "is_hidden": "0"
    }
  ];
  // Your second json
  List<Map<String, String>> map2 = [
    {
      "poi_id": "1",
      "category_id": "1",
      "language_code": "it",
      "poi_name": "chiese",
      "poi_description": "",
      "poi_image": "church.jpg"
    },
    {
      "poi_id": "2",
      "category_id": "1",
      "language_code": "it",
      "poi_name": "monumenti",
      "poi_description": "",
      "poi_image": "monument.jpg"
    },
    {
      "poi_id": "3",
      "category_id": "2",
      "language_code": "it",
      "poi_name": "musei",
      "poi_description": "",
      "poi_image": "museum.jpg"
    }
  ];
  // The function that interests you (returns a map in the format you wanted)
  Map<String, List> convertData(List<Map> categories, List<Map> pois) {
    Map<String, List> result = {};
    for (var category in categories) {
      List<Map> poisOfCategory = [];
      for (var poi in pois) {
        if (category['category_id'] == poi['category_id']) {
          poisOfCategory.add(poi);
        }
      }
      result[category['category_name']] = poisOfCategory;
    }
    return result;
  }
  // Prints the map as a string
  print(json.encode(convertData(map1, map2)));
}

The output would be:

{
   "punti d'interesse":[
      {
         "poi_id":"1",
         "category_id":"1",
         "language_code":"it",
         "poi_name":"chiese",
         "poi_description":"",
         "poi_image":"church.jpg"
      },
      {
         "poi_id":"2",
         "category_id":"1",
         "language_code":"it",
         "poi_name":"monumenti",
         "poi_description":"",
         "poi_image":"monument.jpg"
      }
   ],
   "farmacie":[
      {
         "poi_id":"3",
         "category_id":"2",
         "language_code":"it",
         "poi_name":"musei",
         "poi_description":"",
         "poi_image":"museum.jpg"
      }
   ]
}
DICTIONARY FLUTTER JSON
SHARE: