【发布时间】:2022-01-20 15:16:51
【问题描述】:
我有一些类可以很好地使用颤振的 jsonEncode/jsonDecode 宏进行序列化:
part 'friend.g.dart';
@JsonSerializable(explicitToJson: true)
class Friend {
Friend({required this.name});
@JsonKey(required: true)
late String name;
@JsonKey(required: true)
late final Preferences prefTree;
@JsonKey(required: false, defaultValue: "assets/avatars/cat.png")
late String avatarAsset = avatarAssets[Random().nextInt(avatarAssets.length-1)];
factory Friend.fromJson(Map<String, dynamic> json) => _$FriendFromJson(json);
Map<String, dynamic> toJson() => _$FriendToJson(this);
Map<String, dynamic> _$FriendToJson(Friend instance) => <String, dynamic>{
'name': instance.name,
'avatarAsset': instance.avatarAsset,
'isFavorite': instance.isFavorite,
'prefTree': instance.prefTree,
};
....
}
它工作得很好,反序列化时如果json文件中不存在JSON值,它将使用默认值。
问题在于序列化程序。
我想要的是那个
- 当我的类属性有默认值时,并且
- 该属性不是必需的,并且
- 我的实例的属性值和默认值一样,
==> 则序列化程序不会写下 json 文件中的值。 这将在 JSON 文件中为我节省数十万行。
我阅读了不同的 JSON 成员,例如“required”、“defaultValue”等,并且我使用了它们,但序列化程序似乎仍然没有考虑到这一点。 再一次,反序列化器就像一个魅力。 所以不要让我的类序列化到这个:
{
"itemName": "Brown",
"itemIconString": "",
"isAPreference": false
},
我想让它像这样序列化(因为默认值):
{
"itemName": "Brown",
},
是我还是无法避免jsonEncode中输出成员的默认值?
谢谢!
【问题讨论】: