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

如何在Flutter中用json_serializable检查对象编译/运行时可序列化?

解决json_serializable的编译时/无反射运行时序列化检查问题

1. 编译时检查实现方案

因为json_serializable基于注解而非继承,要实现编译时检查,我们可以通过自定义接口绑定序列化能力,结合Dart的泛型约束来实现编译期校验:

  • 首先定义一个包含序列化方法签名的抽象接口:
abstract class JsonSerializableObject {
  Map<String, dynamic> toJson();
}
  • 让所有使用@JsonSerializable()注解的类显式实现这个接口(json_serializable会自动生成toJson()方法,无需手动编写方法体):
@JsonSerializable()
class Person implements JsonSerializableObject {
  final String name;
  final int age;

  Person({required this.name, required this.age});

  factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
  @override
  Map<String, dynamic> toJson() => _$PersonToJson(this);
}
  • 给泛型方法添加接口约束,这样编译时就会拦截不符合要求的参数:
// 仅允许传入实现了JsonSerializableObject的类型,编译不通过直接报错
void processSerializable<T extends JsonSerializableObject>(T object) {
  print('The object is serializable');
  // 这里可以安全调用object.toJson(),不会出现编译错误
}

2. 无反射的运行时检查方案

如果需要在运行时动态判断对象是否可序列化,直接用Dart原生的is运算符即可,完全不需要反射:

bool isSerializable(Object object) {
  return object is JsonSerializableObject;
}

调用示例:

void main() {
  var person = Person(name: 'John', age: 30);
  var nonSerializable = 'test string';

  print(isSerializable(person)); // 输出true
  print(isSerializable(nonSerializable)); // 输出false
}

补充说明

  • 若需要同时检查反序列化能力(即类是否有fromJson工厂方法),由于Dart接口无法强制静态方法,可额外给序列化类添加静态标记属性来辅助判断,但多数业务场景下,仅检查序列化(toJson)能力就足够。
  • 该方案完全兼容json_serializable原有工作流程,只是给注解类增加了接口实现,没有侵入性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 22:09:55