如何按值传递对象实例并让其在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
相关产品推荐
相关产品推荐

