Flutter/Dat:减小JSON文件的大小



我有几个类可以很好地与flutter 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值,它将使用默认值。

问题出在序列化程序上。

我想要的是

  1. 当我的class属性具有默认值时,并且
  2. 该属性不是必需的,并且
  3. 我的实例的属性值与默认值相同

=>那么序列化程序将不会在json文件中写下该值。这将为我在JSON文件中节省成千上万行。

我读到不同的JSON成员,比如";所需"defaultValue";,等等,我使用了它们,但序列化程序似乎仍然没有考虑到这一点。同样,反序列化程序的工作方式很有魅力。因此,我的类没有序列化为:

{
"itemName": "Brown",
"itemIconString": "",
"isAPreference": false
},

我想让它像这样序列化(因为默认值(:

{
"itemName": "Brown",
},

是我还是无法避免在jsonEncode中输出成员的默认值?

谢谢!

我不认为JsonSerializable提供这样的选项。但是你可以手动写。

这里有一个例子:

class Test {

final int a; // default is 1
final int b; // default is 2

Test({ this.a = 1, this.b = 2});

Map<String, dynamic> toJson() {
final result = <String, dynamic>{};
if (a != 1) {
result['a'] = a;
}
if (b != 2) {
result['b'] = b;
}
return result;
}
}

void main() {
final t = Test(a: 1, b: 1);
print(t.toJson());
}