Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Dart Enums included as Null in Json even if include_if_null: false

This is a new issue I’ve found and was wondering if anyone else encountered it. Recently in my classes that have an enum field, when I use the toJson() method, any of the enums that are null produce a null in the map, even if they should be ignored. For instance:

import 'package:freezed_annotation/freezed_annotation.dart';

part 'temp.freezed.dart';
part 'temp.g.dart';

enum YesNo { yes, no }

@freezed
class Temp1 with _$Temp1 {
  Temp1._();
  factory Temp1({
    String? name,
    YesNo? yesno,
  }) = _Temp1;

  factory Temp1.fromJson(Map<String, dynamic> json) => _$Temp1FromJson(json);
}

@JsonSerializable(includeIfNull: false)
class Temp2 {
  Temp2({
    this.name,
    this.yesno,
  });

  String? name;
  YesNo? yesno;

  factory Temp2.fromJson(Map<String, dynamic> json) => _$Temp2FromJson(json);
  Map<String, dynamic> toJson() => _$Temp2ToJson(this);
}

If I then run this:

import 'temp.dart';

void main() {
  final temp1 = Temp1(yesno: YesNo.no);
  final temp2 = Temp2(yesno: YesNo.yes);
  print(temp1.toJson());
  print(temp2.toJson());
}

I get:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

{yesno: null}
{yesno: null}

I’ve also tried including a build.yaml file

targets:
    $default:
      builders:
        json_serializable:
          options:
            # Options configure how source code is generated for every
            # `@JsonSerializable`-annotated class in the package.
            #
            # The default value for each is listed.
            any_map: false
            checked: false
            create_factory: true
            create_to_json: true
            disallow_unrecognized_keys: false
            explicit_to_json: true
            field_rename: none
            ignore_unannotated: false
            include_if_null: false

With the same results. I thought maybe it was an issue with freezed or json_serializable, but using older versions of the packages I get the same issue. However, it is definitely a code generation issue. If I look into the temp.g.dart generated from the above file, I see:

Map<String, dynamic> _$Temp2ToJson(Temp2 instance) {
  final val = <String, dynamic>{};

  void writeNotNull(String key, dynamic value) {
    if (value != null) {
      val[key] = value;
    }
  }

  writeNotNull('name', instance.name);
  val['yesno'] = _$YesNoEnumMap[instance.yesno];
  return val;
}

Previously it would have given me something like:

Map<String, dynamic> _$Temp2ToJson(Temp2 instance) {
  final val = <String, dynamic>{};

  void writeNotNull(String key, dynamic value) {
    if (value != null) {
      val[key] = value;
    }
  }

  writeNotNull('name', instance.name);
  writeNotNull('yesno', _$YesNoEnumMap[instance.yesno];
  return val;
}

Anyone else run into this issue?

>Solution :

You are doing things correct. There is a pull request to fix this issue and it seems it is soon live. Just final tests (checking clean merge) that isn’t passing:

https://github.com/google/json_serializable.dart/pull/1223

https://github.com/google/json_serializable.dart/commit/5107ac1df814527853ab65686dced776335bf498

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading