如何在 json_serializable 中使用私有构造函数
How to use private constructor in json_serializable
我在 class 中使用私有构造函数,但代码生成失败
The class Foo
has no default constructor.
我使用的是最新的 json_serializable:
版本,即 6.1.5
:
@JsonSerializable()
class Foo {
final int count;
Foo._(this.count);
factory Foo.fromJson(Map<String, dynamic> json) => _$Foo._FromJson(json);
}
我做错了什么?
由于您使用 _
声明了构造函数,因此 class 没有默认构造函数。要解决您的问题,请删除 _
.
@JsonSerializable()
class Foo {
final int count;
const Foo(this.count);
factory Foo.fromJson(Map<String, dynamic> json) => _$Foo._FromJson(json);
}
如果你需要json_serializable:为你生成,你必须定义默认构造函数。但你可以玩这个把戏:
先做这个然后运行 build_runner:
@JsonSerializable()
class Foo {
final int count;
Foo(this.count);
factory Foo.fromJson(Map<String, dynamic> json) => _$FooFromJson(json);
}
然后改成这样:
@JsonSerializable()
class Foo {
final int count;
Foo._(this.count);
factory Foo.fromJson(Map<String, dynamic> json) => _$FooFromJson(json);
}
然后转到 _.g.dart 并调用私有构造函数:
Foo _$FooFromJson(Map<String, dynamic> json) => Foo._(
json['count'] as int,
);
Map<String, dynamic> _$FooToJson(Foo instance) => <String, dynamic>{
'count': instance.count,
};
可以使用JsonSerializable
的4.2.0-dev
中介绍的@JsonSerializable(constructor: '_')
。
这将允许您在创建 fromJson
帮助程序时指定要调用的替代构造函数。
例如:
import 'package:json_annotation/json_annotation.dart';
part 'foo.g.dart';
@JsonSerializable(constructor: '_')
class Foo {
final int count;
Foo._(this.count);
factory Foo.fromJson(Map<String, dynamic> json) => _$FooFromJson(json);
}
现在在这里,而不是像这样使用 fromJson
_$Foo._FromJson(json)
,而是使用 _$FooFromJson(json)
我在 class 中使用私有构造函数,但代码生成失败
The class
Foo
has no default constructor.
我使用的是最新的 json_serializable:
版本,即 6.1.5
:
@JsonSerializable()
class Foo {
final int count;
Foo._(this.count);
factory Foo.fromJson(Map<String, dynamic> json) => _$Foo._FromJson(json);
}
我做错了什么?
由于您使用 _
声明了构造函数,因此 class 没有默认构造函数。要解决您的问题,请删除 _
.
@JsonSerializable()
class Foo {
final int count;
const Foo(this.count);
factory Foo.fromJson(Map<String, dynamic> json) => _$Foo._FromJson(json);
}
如果你需要json_serializable:为你生成,你必须定义默认构造函数。但你可以玩这个把戏:
先做这个然后运行 build_runner:
@JsonSerializable()
class Foo {
final int count;
Foo(this.count);
factory Foo.fromJson(Map<String, dynamic> json) => _$FooFromJson(json);
}
然后改成这样:
@JsonSerializable()
class Foo {
final int count;
Foo._(this.count);
factory Foo.fromJson(Map<String, dynamic> json) => _$FooFromJson(json);
}
然后转到 _.g.dart 并调用私有构造函数:
Foo _$FooFromJson(Map<String, dynamic> json) => Foo._(
json['count'] as int,
);
Map<String, dynamic> _$FooToJson(Foo instance) => <String, dynamic>{
'count': instance.count,
};
可以使用JsonSerializable
的4.2.0-dev
中介绍的@JsonSerializable(constructor: '_')
。
这将允许您在创建 fromJson
帮助程序时指定要调用的替代构造函数。
例如:
import 'package:json_annotation/json_annotation.dart';
part 'foo.g.dart';
@JsonSerializable(constructor: '_')
class Foo {
final int count;
Foo._(this.count);
factory Foo.fromJson(Map<String, dynamic> json) => _$FooFromJson(json);
}
现在在这里,而不是像这样使用 fromJson
_$Foo._FromJson(json)
,而是使用 _$FooFromJson(json)