Flutter调用jsonEncode序列化AddProjectModel报编码异常
问题根因
报错是jsonEncode序列化失败导致的,两个触发点:
- 你直接把
AddProjectModel类实例传给了jsonEncode()。Dart内置的jsonEncode不会自动调用自定义类的toJson()方法,它仅支持直接序列化字符串、数字、布尔值、null、列表、键为字符串类型的Map,遇到自定义类实例就会抛出你看到的"无法将对象转为可编码对象"异常。 - 即使你正确调用了
toJson(),当前方法里直接把DateTime类型的completionDate字段放入返回的Map,DateTime同样不属于JSON原生支持的可序列化类型,还是会触发序列化报错。
修复步骤
修正jsonEncode的入参
把addProject方法里构造请求体的代码:body: jsonEncode(projectModel),改为:
body: jsonEncode(projectModel.toJson()),序列化DateTime类型字段
修改AddProjectModel的toJson()方法中completeDate字段的赋值逻辑,将DateTime转为JSON支持的格式,优先用接口要求的格式,通用场景选ISO8601字符串即可:// 原代码 data['completeDate'] = completionDate; // 修改为ISO8601标准字符串 data['completeDate'] = completionDate.toIso8601String(); // 如果接口要求传毫秒时间戳,就替换为下面这行 // data['completeDate'] = completionDate.millisecondsSinceEpoch;注意:对应的
fromJson反序列化方法也要同步适配,比如用ISO字符串的话,反序列化时要写completionDate = DateTime.parse(json['completeDate']),否则读接口返回数据时该字段会是字符串类型,和你定义的DateTime类型不匹配。
补充说明
你定义的另外三个关联模型(AddProjectCompaniesModel/AddEditFacilitiesModel/AddProjectPicturesModel)当前toJson()返回的字段全是基础可序列化类型,只要改完上面两个问题就不会再触发序列化报错。
额外提醒:如果后续你要上传本地图片文件,file字段如果存的是File实例或者本地文件二进制流,是无法通过普通JSON请求传输的,需要改用multipart/form-data格式的请求,和你当前遇到的报错无关。
内容的提问来源于stack exchange,提问作者Omar AbdulGhani
相关产品推荐
相关产品推荐

