Как правильно сериализовать / десериализовать карту в dart / flutter? - PullRequest
0 голосов
/ 09 мая 2020

Не могли бы вы показать, как сериализовать / деэериализовать карту <> в / из json в dart? Например, вот простой класс данных:

class SimpleData {
  int _blah;
  String _str;

  SimpleData([this._blah, this._str]);

  SimpleData.fromJson(Map<String, dynamic> json) {
    _blah = json['b'];
    _str = json['s'];
  }

  Map<String, dynamic> toJson() => {
    'b' : _blah,
    's' : _str,
  };
}

Вот класс SimpleData, используемый в карте:

class MapTest {
  Map<int, SimpleData> _mapHell = Map<int, SimpleData>();

  MapTest() {
    _mapHell[1] = SimpleData(42, "Astfgl");
    _mapHell[666] = SimpleData(1234, "Vassenego");
  }

  MapTest.fromJson(Map<String, dynamic> json) {
    _mapHell = jsonDecode(json['coworkers']);
  }

  Map<String, dynamic> toJson() => {
    'coworkers' : jsonEncode(_mapHell),
  };
}

Теперь при вызове MapTest.toJson() выдается следующая ошибка:

Ошибка преобразования объекта в кодируемый объект: _LinkedHashMap len: 2

У вас есть идеи, что не так с методами toJson()/fromJson()? Спасибо.

1 Ответ

1 голос
/ 09 мая 2020

Кодирование / декодирование правильное, только JSON допускает только строки в качестве ключа. Измените _mapHell на Map<String, SimpleData>, подойдет

class MapTest {
  final _mapHell = Map<String, SimpleData>(); // Change the Map type

  MapTest() {
    _mapHell['1'] = SimpleData(42, "Astfgl"); // Use int, ie: '1'
    _mapHell['666'] = SimpleData(1234, "Vassenego");
  }

  MapTest.fromJson(Map<String, dynamic> json) {
    _mapHell = jsonDecode(json['coworkers']);
  }

  Map<String, dynamic> toJson() => {
    'coworkers' : jsonEncode(_mapHell),
  };
}
...