标志忽略属性 build_runner 的序列化
Posted
技术标签:
【中文标题】标志忽略属性 build_runner 的序列化【英文标题】:Flag to ignore serialization of property build_runner 【发布时间】:2019-08-06 08:41:18 【问题描述】:有没有办法忽略 JsonSerializable 类中属性的序列化?
我正在使用 build_runner 来生成映射代码。
实现此目的的一种方法是在 .g.dart 文件中注释该特定属性的映射,但如果可以在属性上添加忽略属性会很棒。
import 'package:json_annotation/json_annotation.dart';
part 'example.g.dart';
@JsonSerializable()
class Example
Example(this.a, this.b, this.c,);
int a;
int b;
/// Ignore this property
int c;
factory Example.fromJson(Map<String, dynamic> json) =>
_$ExampleFromJson(json);
Map<String, dynamic> toJson() => _$ExampleToJson(this);
结果
Example _$ExampleFromJson(Map<String, dynamic> json)
return Example(a: json['a'] as int, b: json['b'] as int, c: json['c'] as int);
Map<String, dynamic> _$ExampleToJson(Example instance) =>
<String, dynamic>'a': instance.a, 'b': instance.b, 'c': instance.c;
我所做的是通过注释 c 的映射来实现这一点。
Example _$ExampleFromJson(Map<String, dynamic> json)
return Example(a: json['a'] as int, b: json['b'] as int, c: json['c'] as int);
Map<String, dynamic> _$ExampleToJson(Example instance) =>
<String, dynamic>'a': instance.a, 'b': instance.b, /* 'c': instance.c */;
【问题讨论】:
【参考方案1】:在您不想包含的字段前添加@JsonKey(ignore: true)
@JsonKey(ignore: true)
int c;
另见https://github.com/dart-lang/json_serializable/blob/06718b94d8e213e7b057326e3d3c555c940c1362/json_annotation/lib/src/json_key.dart#L45-L49
【讨论】:
太棒了,它就像一个魅力!我刚刚检查了 build_runner 文档,但在那里找不到。我猜它在 JsonAnnotation-documentation 中?感谢您的快速回复。 当你使用继承时这似乎不起作用... 如何让它只忽略toJson
方法?
请原谅我之前的语言,我的用例是:有property
我想从 json 转换为我的模型,但是当我从模型创建 json 时我想忽略,希望这个回复澄清一下。
@buncis 我想我明白了,但我没有解决方案【参考方案2】:
解决方法是将属性设置为null
并将includeIfNull
标志设置为false:
toNull(_) => null;
@freezed
class User with _$User
const factory User(
...
@Default(false)
@JsonKey(toJson: toNull, includeIfNull: false)
bool someReadOnlyProperty,
) = _User;
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
而生成的代码是:
/// user.g.dart
Map<String, dynamic> _$$_UserToJson(_$_User instance)
final val = <String, dynamic>
...
;
void writeNotNull(String key, dynamic value)
if (value != null)
val[key] = value;
writeNotNull('someReadOnlyProperty', toNull(instance.someReadOnlyProperty));
return val;
【讨论】:
以上是关于标志忽略属性 build_runner 的序列化的主要内容,如果未能解决你的问题,请参考以下文章