Flutter/Dart:如何将扁平JSON序列化为含嵌套类的实体类?
无需DTO类,处理扁平JSON的两种实现方式
针对你遇到的扁平结构JSON序列化需求,不用额外创建DTO类,有两种基于json_serializable的可行方案:
方案一:手动实现序列化/反序列化逻辑
直接在User类里自定义fromJson和toJson方法,手动处理扁平字段与嵌套Address类的转换:
import 'package:json_annotation/json_annotation.dart'; import 'address.dart'; part 'user.g.dart'; @JsonSerializable() class User { User(this.name, this.address); String name; Address address; // 从扁平JSON中提取字段构造User和Address factory User.fromJson(Map<String, dynamic> json) { return User( json['name'] as String, Address( json['street'] as String, json['city'] as String, ), ); } // 将User和Address的字段平铺为顶层JSON结构 Map<String, dynamic> toJson() { final jsonMap = <String, dynamic>{'name': name}; jsonMap.addAll(address.toJson()); return jsonMap; } }
这种方式完全自定义转换逻辑,跳过自动生成的代码,适合结构简单的场景。
方案二:结合@JsonKey注解自定义映射
如果想保留json_serializable的自动生成能力,可以通过@JsonKey的回调函数处理address字段的特殊转换:
import 'package:json_annotation/json_annotation.dart'; import 'address.dart'; part 'user.g.dart'; @JsonSerializable() class User { User(this.name, this.address); String name; // 给address字段指定自定义的序列化/反序列化逻辑 @JsonKey(fromJson: _addressFromFlatJson, toJson: _addressToFlatJson) Address address; factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); // 从扁平JSON中构造Address对象 static Address _addressFromFlatJson(Map<String, dynamic> json) { return Address(json['street'] as String, json['city'] as String); } // 将Address转换为可平铺的键值对 static Map<String, dynamic> _addressToFlatJson(Address address) { return address.toJson(); } }
这种方式保留了自动生成代码的便利性,只需维护自定义的转换回调函数即可。
内容的提问来源于stack exchange,提问作者Денис Федосеев
相关产品推荐
相关产品推荐

