-1

在我的客户中,我有一个类,例如,ClassA它包含一个属性List<ClassB>

我的目标是将对象保存ClassA在 Firestore 中。此外,我希望将List<ClassB>属性作为 Map 而不是 Array 保存到 Firestore 中(也可以将其保存为List<Object>客户端中的一个)。

由于我想使用该json_serializable库,有没有一种方法可以为给定类的属性指定如何序列化/反序列化并选择应为 Firestore 映射使用哪种密钥?

4

2 回答 2

0

我确实找到了我的问题的答案。

因此,为了使用json_serializable其余ClassA属性,我必须使用@JsonKey属性的注释List<ClassB>。通过这样做,我可以使用自定义fromJson/toJson方法。在这种方法中,我可以转换myList为 Firestore 的适当地图。

这就是我必须使用它的方式:

@JsonKey( fromJson: _firestoreMapToList, toJson: _listToFirestoreMap)
final List<ClassB> myList;

方法_firestoreMapToList_listToFirestoreMap将“覆盖”classA.g.dart文件的自动生成方法,在使用json_serializable库并flutter pub run build_runner watch在终端中输入时也会自动生成。

这就是这些方法的样子:

static List<ClassB> _firestoreMapToList(Map<String, dynamic> firestoreMap) {
 if (firestoreMap != null) {
  return List<ClassB>.from(firestoreMap?.entries
      ?.map((e) => ClassB.fromJson(e.value))
      ?.toList());
 }
 return null;
}


static Map<String, Map<String, dynamic>> _listToFirestoreMap(List<ClassB> list) {
 if (list != null) {
  return Map<String, Map<String, dynamic>>.from(list?.asMap()?.map(
      (key, classB) => MapEntry(
          classB.firebaseId,
          classB.toJson())))
    ..removeWhere((key, value) => key == null); // remove map entries with null as key
 }
 return null;
}
于 2020-07-20T16:32:02.477 回答
0

为了将 List 转换为 Map,您不需要将对象转换为 JSON 然后再转换回来。

您可以使用Map.fromIterable()或 collection-for 将 List 转换为 Map。看到这个其他的答案

于 2020-07-20T15:30:33.607 回答