google / json_serializable.dart

Generates utilities to aid in serializing to/from JSON.
https://pub.dev/packages/json_serializable
BSD 3-Clause "New" or "Revised" License
1.55k stars 395 forks source link

Generated converters do not work #1298

Closed ibrahim-mubarak closed 1 year ago

ibrahim-mubarak commented 1 year ago

Given the following class


@freezed
class Comment with _$Comment {
  @Entity(realClass: Comment)
  @generateConverters
  const factory Comment({
    @Id(assignable: true) required int id,
    required String name,
    required String email,
    required String body,
    @JsonKey(fromJson: _toOnePostFromJson, toJson: _toOnePostToJson)
        required ToOne<Post> post,
  }) = _Comment;

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

ToOne<Post> _toOnePostFromJson(Map<String, dynamic>? json) =>
    _$toOnePostFromJson(json);

Map<String, dynamic>? _toOnePostToJson(ToOne<Post> object) =>
    _$toOnePostToJson(object);

jsonserializable fails when using @JsonKey's fromJson and toJson directly with the generated methods, `$toOnePostFromJsonand_$toOnePostToJson`

Stack Trace

[SEVERE] json_serializable on lib/data/models/comment.dart:

Could not generate `toJson` code for `post`.
To support the type `ToOne` you can:
* Use `JsonConverter`
  https://pub.dev/documentation/json_annotation/latest/json_annotation/JsonConverter-class.html
* Use `JsonKey` fields `fromJson` and `toJson`
  https://pub.dev/documentation/json_annotation/latest/json_annotation/JsonKey/fromJson.html
  https://pub.dev/documentation/json_annotation/latest/json_annotation/JsonKey/toJson.html
package:post_reader_demo/data/models/comment.freezed.dart:181:21
    ╷
181 │   final ToOne<Post> post;
    │                     ^^^^
    ╵
package:json_serializable/src/encoder_helper.dart 188:7     EncodeHelper._serializeField
package:json_serializable/src/encoder_helper.dart 112:42    EncodeHelper._writeToJsonSimple.<fn>
dart:core                                                   StringBuffer.writeAll
package:json_serializable/src/encoder_helper.dart 109:9     EncodeHelper._writeToJsonSimple
package:json_serializable/src/encoder_helper.dart 85:7      EncodeHelper.createToJson
dart:_internal                                              WhereIterator.moveNext
package:json_serializable/src/json_part_builder.dart 64:27  _UnifiedGenerator.generate
package:source_gen/src/builder.dart 355:23                  _generate

The same works when there is a non generated method, _toOnePostFromJson and _toOnePostToJson , which proxies the request to the generated method.

Reproducible project at https://github.com/ibrahim-mubarak/post_reader_demo

Relevant file https://github.com/ibrahim-mubarak/post_reader_demo/blob/main/post_reader_demo/lib/data/models/post.dart

Output of flutter --version

Flutter 3.7.8 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 90c64ed42b (7 days ago) • 2023-03-21 11:27:08 -0500
Engine • revision 9aa7816315
Tools • Dart 2.19.5 • DevTools 2.20.1
kevmoo commented 1 year ago

JsonSerializable DOES NOT support annotating arguments in constructors. This is a bug for freezed