Closed Igos19 closed 4 years ago
Hi! That's the job of json_serializable, not freezed.
Freezed is merely delegating that part to json_serializable. Consider making an issue on their repository
Just as hint for anybody that also runs into this: this is supported by json_serializable, but has to be enabled, either per class or globally via the explicit_to_json flag in the build.yaml file.
Example:
@freezed
@JsonSerializable(explicitToJson: true)
abstract class MyModel with _$Model{ ... }
targets:
$default:
builders:
json_serializable:json_serializable:
options:
explicit_to_json: true
@knaeckeKami, when using @JsonSerializable annotation, duplicate methods are created:
user.dart:
@freezed
@JsonSerializable(explicitToJson: true)
abstract class User with _$User {
factory User({
String id,
String displayName,
UserLanguage language,
}) = _User;
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
user.g.dart:
//This method is still created and used by Freezed
User _$UserFromJson(Map<String, dynamic> json) {
return User();
}
//This method is created by @JsonSerializable
Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{};
//This method is created by @JsonSerializable
_$_User _$_$_UserFromJson(Map<String, dynamic> json) {
return _$_User(
id: json['id'] as String,
displayName: json['displayName'] as String,
language: json['language'] == null
? null
: UserLanguage.fromJson(json['language'] as Map<String, dynamic>),
);
}
//This method is still created and used by Freezed
Map<String, dynamic> _$_$_UserToJson(_$_User instance) => <String, dynamic>{
'id': instance.id,
'displayName': instance.displayName,
'language': instance.language,
};
@rrousselGit, Is it possible to add the ability to change @JsonSerializable annotation properties through the freezed generator:
user.dart:
@freezed
abstract class User with _$User {
factory User({
String id,
String displayName,
UserLanguage language,
}) = _User;
@explicitToJson
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}
user.freezed.dart:
// Property passed to JsonSerializable annotation
@JsonSerializable(explicitToJson: true)
class _$_User implements _User {
_$_User({this.id, this.displayName, this.language});
factory _$_User.fromJson(Map<String, dynamic> json) =>
_$_$_UserFromJson(json);
@override
final String id;
@override
final String displayName;
@override
final UserLanguage language;
@override
String toString() {
return 'User(id: $id, displayName: $displayName, language: $language)';
}
Do not judge strictly. I don’t know how annotations and generators interact with each other, but I tried to convey the problem.
@Holofox what you want is likely #50
Ah yes, it seems that you need to use the approach via the build.yaml at the moment
Hi,
There's a problem when using property List of generated items, toJson method works incorrect.
Currently toJson method is generated like:
Could you make supporting List in toJson method like this: (in that cases when List isn't List of primivite types)