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

如何按值传递对象实例并让其在JSON中序列化为具体键值对?

解决方案

要让包含嵌套模型类的对象输出正确的JSON格式,核心是让每个模型类都实现JSON序列化方法,在父类的序列化逻辑中调用子类的序列化方法,从而将嵌套对象转为JSON结构而非实例字符串。

方法一:手动实现序列化方法

分别给PreferenceModel和UserModel编写toJson()方法,将类对象转为Map<String, dynamic>,父类中调用子类的toJson()来处理嵌套属性:

1. 定义PreferenceModel类

class PreferenceModel {
  bool showData;

  PreferenceModel({required this.showData});

  // 将类转为Map结构
  Map<String, dynamic> toJson() {
    return {
      'showData': showData,
    };
  }
}

2. 定义UserModel类

class UserModel {
  PreferenceModel preference;
  String? name; // 示例其他属性

  UserModel({required this.preference, this.name});

  // 序列化时调用preference的toJson()
  Map<String, dynamic> toJson() {
    return {
      'preference': preference.toJson(),
      'name': name,
    };
  }
}

3. 生成并打印JSON

使用dart:convert的jsonEncode将Map转为标准JSON字符串:

import 'dart:convert';

void main() {
  final pref = PreferenceModel(showData: true);
  final user = UserModel(preference: pref, name: 'Alex');

  // 转为JSON字符串
  final jsonStr = jsonEncode(user.toJson());
  print(jsonStr);
}

输出结果:

{"preference":{"showData":true},"name":"Alex"}

方法二:使用json_serializable自动生成(推荐)

如果模型类较多,手动写序列化方法效率低,可以用json_serializable包自动生成序列化逻辑:

1. 添加依赖

在pubspec.yaml中添加依赖:

dependencies:
  json_annotation: ^4.8.1

dev_dependencies:
  build_runner: ^2.4.4
  json_serializable: ^6.7.0

2. 定义模型类并添加注解

PreferenceModel:

import 'package:json_annotation/json_annotation.dart';

part 'preference_model.g.dart';

@JsonSerializable()
class PreferenceModel {
  bool showData;

  PreferenceModel({required this.showData});

  // 自动生成的反序列化方法
  factory PreferenceModel.fromJson(Map<String, dynamic> json) => _$PreferenceModelFromJson(json);
  // 自动生成的序列化方法
  Map<String, dynamic> toJson() => _$PreferenceModelToJson(this);
}

UserModel:

import 'package:json_annotation/json_annotation.dart';
import 'preference_model.dart';

part 'user_model.g.dart';

@JsonSerializable()
class UserModel {
  PreferenceModel preference;
  String? name;

  UserModel({required this.preference, this.name});

  factory UserModel.fromJson(Map<String, dynamic> json) => _$UserModelFromJson(json);
  Map<String, dynamic> toJson() => _$UserModelToJson(this);
}

3. 生成序列化代码

在终端运行命令,自动生成.g.dart文件:

dart run build_runner build

4. 使用方式同方法一

同样用jsonEncode(user.toJson())生成JSON字符串,输出结果一致。

注意:直接打印UserModel.preference会输出Instance of 'PreferenceModel',这是Dart默认的对象打印行为。必须通过toJson()转为Map后再编码成JSON字符串,才能得到期望的嵌套结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 13:20:20