如何在 dart/flutter 中正确序列化/反序列化地图?

SeP*_*läm 10 json dart flutter

您能否展示如何在 dart 中将 map<> 与 json 进行序列化/反序列化?例如,这是一个简单的数据类:

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,
  };
}
Run Code Online (Sandbox Code Playgroud)

这是地图中使用的 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),
  };
}
Run Code Online (Sandbox Code Playgroud)

现在,当调用 时MapTest.toJson(),会抛出以下错误:

将对象转换为可编码对象失败:_LinkedHashMap len:2

您知道这些方法有什么问题吗toJson()/fromJson()?谢谢。

Yao*_*hen 5

编码/解码是正确的,只是 JSON 只允许字符串作为键。更改_mapHellMap<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),
  };
}
Run Code Online (Sandbox Code Playgroud)