json_serializable无法为最终字段和getter生成代码



这是我的类:

@JsonSerializable()
class Foo {
final int a = 0;
int get b => 42;
}

生成的代码不包括任何ab字段:

Foo _$FooFromJson(Map<String, dynamic> json) => Foo();
Map<String, dynamic> _$FooToJson(Foo instance) => <String, dynamic>{};

注意:请不要为做Foo(this.a)Foo() : a = 0等事情编写解决方案。我需要保持我的结构原样。

简单的答案-这是不可能的,因为这是故意设计的。


如果调整模型结构是不可能的,您可以尝试手动转换或这两者的混合。

不久前,在我自己遇到同样的问题后,我选择了手动转换我的模型——在某些情况下,还选择了两者的组合。

使用@JsonSerializable,您可以使用from/to生成的方法,然后手动转换final和getter字段。

至少对于getter字段,您可以尝试的另一个选项是使用@JsonSerializable(crateFactory: false)。这将指示引擎也要转换getter。

我建议详细阅读Flutter JSON文档,并根据您的模型、您想要的内容或您可以妥协的内容,找出最适合您的内容。

值得一读关于getter转换的Github线程。

尽管最终字段没有现成的解决方法,但根据这个关于最终字段的Github线程,欢迎PR:(

如果您想要更容易的json解析,请在VS代码中使用Dart数据类生成器扩展。

我认为,由于a是final,它被认为是常量而不是变量,b是getter而不是变量。因此,json_serializable没有变量(字段(可以生成代码。

在运行json_serializable之前,您需要添加一个默认构造函数。由于没有字段,您将生成一个空构造函数和空方法。

class Foo {
final int a = 0;
int get b => 42;
const Foo();
factory Foo.fromJson(Map<String, dynamic> json) => Foo();
Map<String, dynamic> toJson() => <String, dynamic>{};
}

最新更新