Skip to content

Use of a generic JsonConverter #1398

Open
@alexdess

Description

@alexdess

Hello,

I'm stuck on a use case, and am looking for help. I'm using a graphql api that I don't want to modify (directus) and in some cases, the list of elements (here posts) is nested in a sub-element (here "post_id", see fromJson in the WrappedConverter2).

@freezed
class ExamSessionFullDto with _$ExamSessionFullDto implements IExamSessionFull {
  const ExamSessionFullDto._(); 

  const factory ExamSessionFullDto({
    @StringToIntConverter() required int id,
    required String title,
    @WrappedConverter2() List<PostDto>? posts,
  }) = _ExamSessionFullDto;

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

class WrappedConverter2 extends JsonConverter<PostDto, Map<String, dynamic>> {
  const WrappedConverter2();
  @override
  PostDto fromJson(Map<String, dynamic> json) {
    return PostDto.fromJson(json["post_id"]);
  }

  @override
  Map<String, dynamic> toJson(PostDto object) {
    return object.toJson();
  }
}

This code works, but I have to have a converter every time I have a list of items, which isn't ideal because I have to do a lot of copy-and-paste code, which is bad practice.

I've made several attempts to make my converter generic, but unfortunately when I use genericity it doesn't work with freezed, or it's probably me who can't get it right.

Does anyone have a good way to have a single JsonConverter or some other solution that I can apply to all my objects that have sublists of this type?

The idea would be to have something like

class ManyToManyRelationshipConverter<E>
    extends JsonConverter<E, Map<String, dynamic>> {
  final String jsonKey;
  final KreaticItemsConverter<E> converter;

  const ManyToManyRelationshipConverter.forPost(
      {this.jsonKey = "post_id", this.converter = const PostDtoConverter() as KreaticItemsConverter<E>});

  @override
  E fromJson(Map<String, dynamic> json) {
    return converter.fromJson(json[jsonKey]);
  }

  @override
  Map<String, dynamic> toJson(E object) {
    return converter.toJson(object);
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions