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

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,提问作者Денис Федосеев

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:07:13