我使用Dart“ json_serializable”包在Flutter应用程序中在Firestore数据结构下反序列化。
{
googleBookId: jjl4BgAAQBAJ,
providers: [
{providerId: 2FA9fULKLLf7VUPPFnFRnv},
{providerId: 8UYTGUHY7UJS432FVBJRnv}
]
}
下面是要映射的Model类:
@JsonSerializable()
class Book {
String googleBookId;
List<Provider> providers;
Book(this.googleBookId,
{List<Provider> providers})
: providers = providers ?? <Provider>[];
factory Book.fromJson(Map<String, dynamic> map) => _$BookFromJson(map);
Map<String, dynamic> toJson() => _$BookToJson(this);
}
@JsonSerializable()
class Provider {
String providerId;
Provider(this.providerId);
factory Provider.fromJson(Map<String, dynamic> map) => _$ProviderFromJson(map);
Map<String, dynamic> toJson() => _$ProviderToJson(this);
}
反序列化时出现以下错误
_CastError(类型“ _InternalLinkedHashMap”不是强制类型转换中“地图”类型的子类型)
还有其他可以反序列化文档的库吗?
答案 0 :(得分:1)
好的,所以我不知道您是否知道,但是firestore会向您发送一个不是JSON的地图。您正在尝试使用JSON序列化器。
杰森是
Map<String,dynamic>
当Firestore发送时
Map<dynamic,dynamic>.
因此,您不能将其解析为json。
检查https://onelogin.service-now.com/kb_view.do?sysparm_article=KB0011181
答案 1 :(得分:0)
如other question中所述,我能够通过反序列化之前编码为JSON字符串并返回JSON对象来反序列化Firestore文档。
@Chiziaruhoma Ogbonda感谢您的澄清,它帮助我以其他方式思考,而不是直接绑定反序列化文件。
答案 2 :(得分:0)
解决方案是使用anyMap和explicitToJson属性。
@JsonSerializable(explicitToJson: true, anyMap: true)
class Book {
}