Flutter/Dart:减小 JSON 文件的大小
Flutter/Dart: Reduce size of JSON file
我有一些 class 可以很好地使用 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 值,它将使用默认值。
序列化程序有问题。
我想要的是
- 当我的 class 属性具有默认值时,并且
- 该属性不是必需的,并且
- 我的实例的属性值与默认值相同,
==> 那么序列化程序就不会在 json 文件中记下该值。
这将为我在 JSON 文件中节省数十万行。
我了解了不同的 JSON 成员,例如“required”、“defaultValue”等,并且我使用了它们,但序列化程序似乎仍然没有考虑到这一点。
同样,反序列化器的工作就像一个魅力。
因此,与其将我的 classes 序列化为:
{
"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());
}
我有一些 class 可以很好地使用 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 值,它将使用默认值。
序列化程序有问题。
我想要的是
- 当我的 class 属性具有默认值时,并且
- 该属性不是必需的,并且
- 我的实例的属性值与默认值相同,
==> 那么序列化程序就不会在 json 文件中记下该值。 这将为我在 JSON 文件中节省数十万行。
我了解了不同的 JSON 成员,例如“required”、“defaultValue”等,并且我使用了它们,但序列化程序似乎仍然没有考虑到这一点。 同样,反序列化器的工作就像一个魅力。 因此,与其将我的 classes 序列化为:
{
"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());
}