在我的客户中,我有一个类,例如,ClassA
它包含一个属性List<ClassB>
。
我的目标是将对象保存ClassA
在 Firestore 中。此外,我希望将List<ClassB>
属性作为 Map 而不是 Array 保存到 Firestore 中(也可以将其保存为List<Object>
客户端中的一个)。
由于我想使用该json_serializable
库,有没有一种方法可以为给定类的属性指定如何序列化/反序列化并选择应为 Firestore 映射使用哪种密钥?
在我的客户中,我有一个类,例如,ClassA
它包含一个属性List<ClassB>
。
我的目标是将对象保存ClassA
在 Firestore 中。此外,我希望将List<ClassB>
属性作为 Map 而不是 Array 保存到 Firestore 中(也可以将其保存为List<Object>
客户端中的一个)。
由于我想使用该json_serializable
库,有没有一种方法可以为给定类的属性指定如何序列化/反序列化并选择应为 Firestore 映射使用哪种密钥?
我确实找到了我的问题的答案。
因此,为了使用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;
}
为了将 List 转换为 Map,您不需要将对象转换为 JSON 然后再转换回来。
您可以使用Map.fromIterable()
或 collection-for 将 List 转换为 Map。看到这个其他的答案