这是我发现的一个新问题,我想知道是否有其他人遇到过它。最近,在我的类中,当我使用toJson((方法时,任何为null的枚举都会在映射中产生null,即使它们应该被忽略。例如:
import 'package:freezed_annotation/freezed_annotation.dart';
part 'temp.freezed.dart';
part 'temp.g.dart';
enum YesNo { yes, no }
@freezed
class Temp1 with _$Temp1 {
Temp1._();
factory Temp1({
String? name,
YesNo? yesno,
}) = _Temp1;
factory Temp1.fromJson(Map<String, dynamic> json) => _$Temp1FromJson(json);
}
@JsonSerializable(includeIfNull: false)
class Temp2 {
Temp2({
this.name,
this.yesno,
});
String? name;
YesNo? yesno;
factory Temp2.fromJson(Map<String, dynamic> json) => _$Temp2FromJson(json);
Map<String, dynamic> toJson() => _$Temp2ToJson(this);
}
如果我运行这个:
import 'temp.dart';
void main() {
final temp1 = Temp1(yesno: YesNo.no);
final temp2 = Temp2(yesno: YesNo.yes);
print(temp1.toJson());
print(temp2.toJson());
}
我得到:
{yesno: null}
{yesno: null}
我还尝试了包含build.yaml文件
targets:
$default:
builders:
json_serializable:
options:
# Options configure how source code is generated for every
# `@JsonSerializable`-annotated class in the package.
#
# The default value for each is listed.
any_map: false
checked: false
create_factory: true
create_to_json: true
disallow_unrecognized_keys: false
explicit_to_json: true
field_rename: none
ignore_unannotated: false
include_if_null: false
结果相同。我认为这可能是冷冻或json_serializable的问题,但使用旧版本的包时,我也会遇到同样的问题。然而,这绝对是一个代码生成问题。如果我查看从上面的文件生成的temp.g.dart,我会看到:
Map<String, dynamic> _$Temp2ToJson(Temp2 instance) {
final val = <String, dynamic>{};
void writeNotNull(String key, dynamic value) {
if (value != null) {
val[key] = value;
}
}
writeNotNull('name', instance.name);
val['yesno'] = _$YesNoEnumMap[instance.yesno];
return val;
}
以前它会给我这样的东西:
Map<String, dynamic> _$Temp2ToJson(Temp2 instance) {
final val = <String, dynamic>{};
void writeNotNull(String key, dynamic value) {
if (value != null) {
val[key] = value;
}
}
writeNotNull('name', instance.name);
writeNotNull('yesno', _$YesNoEnumMap[instance.yesno];
return val;
}
还有人遇到这个问题吗?
您做的事情是正确的。有一个pull请求来解决这个问题,它似乎很快就会上线。只是未通过的最终测试(检查干净合并(:
https://github.com/google/json_serializable.dart/pull/1223
https://github.com/google/json_serializable.dart/commit/5107ac1df814527853ab65686dced776335bf498
更新:
与6.5.2:合并发布
6.5.2#在对枚举值或具有转换的值进行编码时,更好地处理null。