You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter调用jsonEncode序列化AddProjectModel报编码异常

问题根因

报错是jsonEncode序列化失败导致的,两个触发点:

  • 你直接把AddProjectModel类实例传给了jsonEncode()。Dart内置的jsonEncode不会自动调用自定义类的toJson()方法,它仅支持直接序列化字符串、数字、布尔值、null、列表、键为字符串类型的Map,遇到自定义类实例就会抛出你看到的"无法将对象转为可编码对象"异常。
  • 即使你正确调用了toJson(),当前方法里直接把DateTime类型的completionDate字段放入返回的Map,DateTime同样不属于JSON原生支持的可序列化类型,还是会触发序列化报错。
修复步骤
  1. 修正jsonEncode的入参
    把addProject方法里构造请求体的代码:

    body: jsonEncode(projectModel),
    

    改为:

    body: jsonEncode(projectModel.toJson()),
    
  2. 序列化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 21:03:40