Dart json_serializable 构造参数关联被忽略字段报错如何解决
问题原因
json_serializable生成反序列化逻辑时,需要为构造方法的所有必填参数匹配JSON中的对应字段。你将
item字段标记为@JsonKey(ignore: true)后,序列化和反序列化逻辑都会忽略该字段,反序列化时无法找到值填充构造方法的必填item参数,因此抛出错误。
可行解决方案
方案1:将item设为可选可空参数(最常用)
适用场景:反序列化后item字段可以为空,或者你会在反序列化完成后手动为item赋值。
修改要点:
- 把
item字段改为可空类型MenuItem? - 将构造方法中的
item调整为可选位置参数/命名可选参数,无需加required修饰
@HiveType(typeId: 0) @JsonSerializable() class CartItem extends HiveObject { @HiveField(1) String item_id; @HiveField(2) String name; @HiveField(3) SelectionsList selections; @HiveField(4) String special_instructions; @HiveField(5) int quantity; @HiveField(6) double amount; @HiveField(7) @JsonKey(ignore: true) MenuItem? item; // 改为可空类型 // item调整为可选位置参数,默认值为null CartItem(this.item_id, this.name, this.selections, this.quantity, this.special_instructions, this.amount, [this.item]); }
注意:该修改不影响你手动创建CartItem实例时传入item参数,仅自动反序列化时会为该字段赋值为null
方案2:禁用自动生成反序列化逻辑
适用场景:你只需要用toJson方法把类转成JSON,不需要用自动生成的fromJson方法把JSON转回类。
修改要点:给@JsonSerializable注解添加createFactory: false参数,这样工具只会生成toJson逻辑,不会校验反序列化的构造参数。
@HiveType(typeId: 0) @JsonSerializable(createFactory: false) // 禁用自动生成fromJson class CartItem extends HiveObject { @HiveField(1) String item_id; @HiveField(2) String name; @HiveField(3) SelectionsList selections; @HiveField(4) String special_instructions; @HiveField(5) int quantity; @HiveField(6) double amount; @HiveField(7) @JsonKey(ignore: true) MenuItem item; CartItem(this.item_id, this.name, this.selections, this.quantity, this.special_instructions, this.amount, this.item); }
方案3:自定义反序列化逻辑
适用场景:你需要保留item为必填非空参数,同时需要反序列化能力。
你可以自行实现fromJson工厂方法,反序列化时自行传入/生成对应的MenuItem实例,仅调用自动生成的toJson逻辑即可。
内容的提问来源于stack exchange,提问作者weebkun
相关产品推荐
相关产品推荐

