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

如何在json_serialization中统一设置类所有变量为非必填?

如何在json_serialization中统一设置类所有变量为非必填?

有两种可行的方式实现这个需求,其中第一种是最简便常用的:

1. 使用@JsonSerializable的defaultArgumentValues参数

json_serialization的@JsonSerializable注解提供了defaultArgumentValues参数,可以全局为类中所有未单独配置@JsonKey的字段设置默认的注解参数。只需要把required: false作为默认值传入,就能让所有字段默认变为非必填:

import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable(defaultArgumentValues: {
  'required': false,
})
class User {
  // 即使构造函数里写了required,也会被全局配置覆盖为非必填
  final String name;
  final int? age;

  User({this.name, this.age});

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

如果某个字段需要保持必填,只需要单独给它加上@JsonKey(required: true)注解即可,单独配置会覆盖全局默认值。

2. 自定义代码生成器(不推荐)

如果你的需求非常特殊,全局参数无法满足,可以自定义扩展json_serialization的代码生成逻辑,但这种方式需要修改代码生成器源码或编写自定义生成器,复杂度很高,一般场景下第一种方法完全能解决问题。

注意事项

要确保你的json_annotation和json_serializable依赖版本足够新,defaultArgumentValues参数是在较新版本中引入的,如果项目依赖版本过低,需要先升级pubspec.yaml中的相关依赖。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:14:52