这是我的类:
@JsonSerializable()
class Foo {
final int a = 0;
int get b => 42;
}
生成的代码不包括任何a
或b
字段:
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>{};
}