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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:42:08