Dart json.encode编码结果不符合Firebase Function需求
老兄,我之前也踩过json.encode()的坑!结合你给出的Map结构,大概率是字段类型不兼容JSON序列化规则导致的,给你捋捋可能的原因和解决办法:
核心问题:Dart的json.encode只认JSON原生类型
json.encode()只能序列化这些类型:
- String、num、bool、null
- 包含上述类型的List或Map
如果你的newProfileCreationModel里的字段(比如avatarSrc、heroSrc)是自定义对象(比如File、Image实例,或者你自己写的模型类),那json.encode()根本不知道怎么把它们转成JSON字符串,自然输出不符合预期。
具体解决步骤
先排查每个字段的类型
先把Map里的每个值单独打印出来,或者单独用json.encode()测试:print(json.encode(newProfileCreationModel.avatarSrc)); // 看看会不会报错如果某个字段报错,那就是它的问题——比如如果是File对象,你需要转成文件路径(
avatarSrc.path)或者base64字符串;如果是自定义模型,就得给它加toJson()方法。给自定义模型加toJson()方法
假设NewProfileCreationModel是你自己写的类,一定要实现toJson(),把对象转成纯JSON兼容的Map:class NewProfileCreationModel { String accountID; String profileName; String? profileBody; String avatarSrc; // 如果是File,改成File类型,然后在toJson里转成path String heroSrc; NewProfileCreationModel({ required this.accountID, required this.profileName, this.profileBody, required this.avatarSrc, required this.heroSrc, }); // 关键:实现toJson方法 Map<String, dynamic> toJson() { return { 'uid': accountID, 'displayName': profileName, 'greeting': profileBody ?? '', 'avatarSrc': avatarSrc, // 如果是File,这里写avatarSrc.path 'heroSrc': heroSrc, }; } }之后构建
_data就可以直接用:_data = newProfileCreationModel.toJson();处理可选值和null
你已经用?? ''处理了profileBody的null情况,这点很赞!记得其他可能为null的字段也要做类似处理,避免序列化时出现null导致的异常。排查循环引用
如果上述方法都没用,看看你的Map里有没有循环引用(比如某个字段引用了自身或者父对象),这种情况会直接抛出序列化错误,需要调整数据结构。
按照这些步骤排查,应该就能解决json.encode()输出不符合预期的问题了!
内容的提问来源于stack exchange,提问作者SeaFuzz

