Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flutter Dart deserialize a json with dynamic key but structured values into Map<String, ModelClass>

Is it possible to deserialize a json with dynamic key but structured values into Map in flutter dart.

I am having a json like

{
   "data" : {
            "apple":{"qty":5, "price":100},
            "orange":{"qty":2, "price":40},
           }
}

And I want this to deserialize in flutter/dart to a model class below

class Data {
    Map<String, Item> itemMap;

    factory Data.fromJson(Map<String,dynamic> json) {
        itemMap : json["data"]; //How to parse.
    }
}

class Item {
   int qty;
   int price;
}

I have read through a medium blog and even this also not covering the Map part.

like image 465
Prasanna Anbazhagan Avatar asked Nov 22 '25 03:11

Prasanna Anbazhagan


1 Answers

You need to do something like this:

//...
Future<List<ItemModel>> fetchFood() async {

    List<ItemModel> foodItemsList = [];

    // Get json response and parse it as a Map<String, dynamic>
    final response = {
       "data" : {
            "apple":{"qty":5, "price":100},
            "orange":{"qty":2, "price":40},
           }
       };
    // with your real get request use this:
    // final parsedJson = json.decode(response.body)['data'];

    // Parsed Json have what's inside data, in case of real request look for the line above this.
    final parsedJson = response['data'];

    // Iterate over all fruits and create Item object from each,
    // then push to a list of Item's objects to return it.
    parsedJson.forEach((k,v) => foodItemsList.add(ItemModel.fromJson(v)));

    return foodItemsList;
}

// Item model
class ItemModel {
   int qty;
   int price;

   ItemModel.fromJson(Map<String,dynamic> parsedJson)
      : qty = parsedJson['qty'],
        price = parsedJson['price'];

}

// Then call it
main() async {

  List<ItemModel> foodItemsList = await fetchFood();
  //..
}

If you need the fruit name as part of the object:

//...
Future<List<ItemModel>> fetchFood() async {

    List<ItemModel> foodItemsList = [];

    // Get json response and parse it as a Map<String, dynamic>
    final response = {
       "data" : {
            "apple":{"qty":5, "price":100},
            "orange":{"qty":2, "price":40},
           }
       };
    // with your real get request use this:
    // final parsedJson = json.decode(response.body)['data'];

    // Parsed Json have what's inside data, in case of real request look for the line above this.
    final parsedJson = response['data'];

    // Iterate over all fruits and create Item object from each,
    // then push to a list of Item's objects to return it.
    parsedJson.forEach((fruitName, fruitDetails) 
        => foodItemsList.add(
             ItemModel.fromJson(fruitName, fruitDetails)
        )
    );

    return foodItemsList;
}

// Item model
class ItemModel {
   String name;
   int qty;
   int price;

   ItemModel.fromJson(String fruitName, Map<String,dynamic> parsedJson)
      : name = fruitName,
        qty = parsedJson['qty'],
        price = parsedJson['price'];

}

// Then call it
main() async {

  List<ItemModel> foodItemsList = await fetchFood();
  print(foodItemsList[1].name); //orange
  //..
}

like image 160
Jehad Nasser Avatar answered Nov 25 '25 00:11

Jehad Nasser



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!