【问题标题】:Flag to ignore serialization of property build_runner标志忽略属性 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 */};

【问题讨论】:

    标签: dart flutter json-serialization


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-27
      • 2013-04-07
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 2016-02-03
      • 2016-05-17
      • 1970-01-01
      相关资源
      最近更新 更多