如何在 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,
    };

可以使用JsonSerializable4.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)