Convert Map to json String flutter

3,705

Solution 1

I found an error and it is a very childish error, changed the map type from Map <String, Map <int, String> to Map <String, Map <String, String >>

Map<String, Map<String, String>> resultMap = Map();
    var list = item.variants.values.toList();
    var models = item.variants.keys.toList();
    for (int i = 0; list.length > i; i ++) {
      var variantsName = list.elementAt(i).toList();
      var modelsName = models.elementAt(i);
      Map<String, String> values = Map();
      for (int ind = 0; variantsName.length > ind; ind ++) {
        String reasultC = controllers[i].elementAt(ind).text;
        if (reasultC.isNotEmpty && int.parse(reasultC) > 0) {
          values["${ind + 1}"] = reasultC;
        }
      }
      if (!resultMap.containsKey(modelsName) && values.isNotEmpty) {
        resultMap[modelsName] = values;
      }
    }

Solution 2

This is working correctly with json.encode:

import 'dart:convert';

void main() {
  try {
  var obj = {"variants": {
    "iphone 6": {"1": "8", "2": "6"},
    "xiaomi mi6": {"1": "8", "3": "5"},
    "samsung A6": {"1": "8"}
   }};
  String str = json.encode(obj);
  print(str);
  } catch(e) {
    print(e);
  }
}

DartPad link

Share:
3,705
Vasya2014
Author by

Vasya2014

Updated on December 07, 2022

Comments

  • Vasya2014
    Vasya2014 over 1 year

    I am new to dart, trying to convert Map to json String for sqflite, json.encoder and jsonEncode doesn't work. i tried to use json_serializable but couldn't run build_runner, did a bunch of manipulations with meta and analyzer.

    the problem occurs when converting Variants, this is should look like:

    "variants": {
        "iphone 6": {"1": "8", "2": "6"},
        "xiaomi mi6": {"1": "8", "3": "5"},
        "samsung A6": {"1": "8"}
       }
    

    How it is look like:

     variants: {
        iphone 6: {1: 8, 2: 6},
        xiaomi mi6: {1: 8, 3: 5},
        samsung A6: {1: 8}
       }
    

    SQL func:

    Future<void> addToCart(List<List<TextEditingController>> controllers, Item item) async {
         Map<String, Map<int, String>> resultMap = Map();
        var list = item.variants.values.toList();
        var models = item.variants.keys.toList();
        for (int i = 0; list.length > i; i ++) {
          var variantsName = list.elementAt(i).toList();
          var modelsName = models.elementAt(i);
          Map<int, String> values = Map();
          for (int ind = 0; variantsName.length > ind; ind ++) {
            String reasultC = controllers[i].elementAt(ind).text;
            if (reasultC.isNotEmpty && int.parse(reasultC) > 0) {
              values[ind + 1] = reasultC;
            }
          }
          if (!resultMap.containsKey(modelsName) && values.isNotEmpty) {
            resultMap[modelsName] = values;
          }
        }
    
        db = await openDatabase("$_dbName.db");
        db.execute('''
        CREATE TABLE IF NOT EXISTS $_dbName(
            id INTEGER PRIMARY KEY,
            idItem TEXT,
            title TEXT,
            variants TEXT,
            images TEXT)
        ''');
    
        var end = Cart(idItem: item.id, title: item.title, variants: resultMap, images: item.images).toJson();
        print(end);
        
        await db.insert(_dbName, end);
        await db.close();
    }
    
    class Cart {
      String idItem;
      String title;
      Map<String, dynamic> variants;
      List<String> images;
    
      Cart({this.idItem, this.title, this.variants, this.images});
    
      Map<String, dynamic> toJson() =>
          <String, dynamic>{
            'idItem': this.idItem,
            'title': this.title,
            'variants': jsonEncode(this.variants), <= NoSuchMethodError: Class '_InternalLinkedHashMap<int, String>' has no instance method 'toJson'. Receiver: _LinkedHashMap len:1 T
            'images': json.encode(this.images)
          };
    }
    

    Thanks.

    • stacktrace2234
      stacktrace2234 over 2 years
      What is the problem? What makes you say it does not work? How the JSON it generates look like?
    • Vasya2014
      Vasya2014 over 2 years
      @stacktrace2234 I need convert map 'variants' to json string, added how it looks and how it should look
    • stacktrace2234
      stacktrace2234 over 2 years
      Did you try 'variants': jsonEncode(this.variants)?
    • Vasya2014
      Vasya2014 over 2 years
      @stacktrace2234 I did
    • stacktrace2234
      stacktrace2234 over 2 years
      Isn't this what you try to achieve: i.imgur.com/jiPl3WT.png ?
    • Vasya2014
      Vasya2014 over 2 years
      @stacktrace2234 is it
    • Vasya2014
      Vasya2014 over 2 years
      I get error when use encode: NoSuchMethodError: Class '_InternalLinkedHashMap<int, String>' has no instance method 'toJson'. Receiver: _LinkedHashMap len:1 T
    • stacktrace2234
      stacktrace2234 over 2 years
      Edit the question with the new code.
    • Vasya2014
      Vasya2014 over 2 years
      @stacktrace2234 I did it
  • Vasya2014
    Vasya2014 over 2 years
    my map is without quotes