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

json_annotation无法正确处理嵌套类:toJson未映射Item列表

解决json_serializable嵌套类列表序列化失效问题

问题核心

你的InventoryResult类自动生成的toJson方法中,直接将List<Item>类型的results字段放入Map,没有调用每个Item对象的toJson()方法,导致序列化时Item仅输出Instance of 'Item'字符串;而反序列化(fromJson)能正常解析嵌套类,是因为生成器自动识别了Item的fromJson工厂方法。

修复步骤

1. 确保注解与导入完整性

  • 确认InventoryResult和Item类都添加了@JsonSerializable()注解
  • 确保InventoryResult所在文件已正确导入Item类的文件,且两个类都导入了package:json_annotation/json_annotation.dart

2. 强制重新生成序列化代码

生成器缓存是导致代码未更新的常见原因,执行以下操作彻底重建:

  • 删除所有生成的.g.dart文件(包括InventoryResult和Item对应的)
  • 运行命令重新生成代码:
    flutter pub run build_runner build --delete-conflicting-outputs
    
    重新生成后,_$InventoryResultToJson方法应自动修正为:
    Map<String, dynamic> _$InventoryResultToJson(InventoryResult instance) =>
        <String, dynamic>{
          'results': instance.results.map((e) => e.toJson()).toList(),
          'number': instance.number,
          'offset': instance.offset,
          'totalResults': instance.totalResults,
        };
    

3. (可选)手动指定序列化逻辑

如果自动生成仍有问题,可在InventoryResult的results字段上显式指定序列化函数:

@JsonSerializable()
class InventoryResult {
  @JsonKey(toJson: _itemsToJson)
  List<Item> results;
  // ...其他字段和方法
}

// 自定义序列化函数
List<Map<String, dynamic>> _itemsToJson(List<Item> items) =>
    items.map((item) => item.toJson()).toList();

原因分析

你后期才给Item类添加toJson方法,生成器可能缓存了旧的InventoryResult序列化逻辑,没有同步更新嵌套类的序列化处理。彻底删除生成文件并强制重建,能清除缓存,让生成器重新识别Item的toJson方法。

内容的提问来源于stack exchange,提问作者Stooges4

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:45:05