Flutter json_serializable:如何让两个变量共用同一JSON键quantity?
解决方法
因为json_serializable不允许多个字段绑定同一个JSON键,你可以通过手动在fromJson工厂函数中赋值的方式实现需求,同时调整字段的注解配置:
步骤1:调整字段注解
移除其中一个字段(比如availableQuantity)的@JsonKey(name: "quantity")注解,避免重复键冲突:
import 'package:json_annotation/json_annotation.dart'; part 'food_model.g.dart'; @JsonSerializable(explicitToJson: true,) class FoodModel { String? id; String? name; String? status; String? description; double? price; // 保留该字段的@JsonKey,用于JSON反序列化和序列化 @JsonKey(name: "quantity") int quantity = 1; String? category; // 移除重复的@JsonKey注解 int? availableQuantity; double? initialPrice; String? location; List<Images>? images; FoodModel( {this.id, this.name, this.status, this.location, this.description, this.category, this.price, this.quantity = 1, this.availableQuantity}); // 构造函数添加availableQuantity参数 }
步骤2:修改fromJson工厂函数
手动将JSON中的quantity值同时赋值给quantity和availableQuantity:
factory FoodModel.fromJson(Map<String, dynamic> json) { // 先调用自动生成的反序列化函数 final model = _$FoodModelFromJson(json); // 手动同步quantity值到availableQuantity model.availableQuantity = json['quantity'] as int?; // 若JSON中无quantity字段,用quantity的默认值1填充 if (model.availableQuantity == null) { model.availableQuantity = model.quantity; } return model; }
步骤3:处理toJson(可选)
如果序列化时只需要输出一个quantity字段,当前配置已满足(仅quantity字段带有@JsonKey(name: "quantity"))。若需同时输出两个关联键,可手动修改toJson函数:
Map<String, dynamic> toJson() { final json = _$FoodModelToJson(this); // 可选:添加availableQuantity对应的自定义键 json['available_quantity'] = availableQuantity; return json; }
这样既解决了重复键的报错,又实现了将同一个JSON字段映射到两个类变量的需求。
内容的提问来源于stack exchange,提问作者ahmed mohamed abdulkadir
相关产品推荐
相关产品推荐

