google / google/json_serializable.dart

Json_serializable not converting ExplicitToJson sub-fields properly

Open
#1,365 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
Dart
Stars
1.6k
Forks
461
Avg merge
45m
Merged PRs (30d)
1

Description

### Issue

I'm having an issue with json_serializable, with a class, `GroupDto` that has a property made up of a List of `MemberDto` within it.

It is supposed to convert the List of MemberDto to Json as well, but it appears this is not happening - I keep getting the following error:
`Argument Error: Instance of 'MemberDto'`

When I inspect the element as the Json conversion is happening, it appears the list is still being returned as a MemberDto, instead of converting to Json.

This issue was happening on version 6.6.1, but I upgraded to version 6.7.1 and it is still happening.

Note: I also have 2 other classes set up in a similar way, and the issue is present with them as well.

### Class Code
```
import 'package:json_annotation/json_annotation.dart';

part 'group_dto.g.dart';

@JsonSerializable(includeIfNull: false)
class GroupDto {
@JsonKey(includeFromJson: false, includeToJson: false)
final String? id;
final String title;
final String? description;
final List? members;

GroupDto({
this.id,
required this.title,
this.description,
this.members,
});

factory GroupDto.fromDomain(Group group) {
return GroupDto(
id: group.id,
title: group.title.getOrCrash(),
description: group.description,
members: group.members.isNotEmpty
? group.members.map((e) => MemberDto.fromDomain(e)).toList()
: null,
);
}

Group toDomain() {
return Group(
id: id,
title: ItemTitle(title),
description: description,
members: members != null
? members!.map((dto) => dto.toDomain()).toList()
: const [],
);
}

factory GroupDto.fromFirestore(
Map json, String documentId) =>
_$GroupDtoFromJson(json).copyWith(id: documentId);

factory GroupDto.fromJson(Map json) =>
_$GroupDtoFromJson(json);

Map toJson() => _$GroupDtoToJson(this);

GroupDto copyWith({
String? id,
String? title,
String? description,
List? members,
}) {
return GroupDto(
id: id ?? this.id,
title: title ?? this.title,
description: description ?? this.description,
members: members ?? this.members,
);
}
}

@JsonSerializable(includeIfNull: false, explicitToJson: true)
class MemberDto {
final String userId;
final MembershipStatus status;

MemberDto({
required this.userId,
required this.status,
});

factory MemberDto.fromDomain(Member membership) {
return MemberDto(
userId: membership.userId,
status: membership.status,
);
}

Member toDomain() {
return Member(
userId: userId,
status: status,
);
}

factory MemberDto.fromJson(Map json) =>
_$MemberDtoFromJson(json);

Map toJson() => _$MemberDtoToJson(this);
}
```

### Generated Code
```
// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'group_dto.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

GroupDto _$GroupDtoFromJson(Map json) => GroupDto(
title: json['title'] as String,
description: json['description'] as String?,
members: (json['members'] as List?)
?.map((e) => MemberDto.fromJson(e as Map))
.toList(),
);

Map _$GroupDtoToJson(GroupDto instance) {
final val = {
'title': instance.title,
};

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

writeNotNull('description', instance.description);
writeNotNull('members', instance.members);
return val;
}

MemberDto _$MemberDtoFromJson(Map json) => MemberDto(
userId: json['userId'] as String,
status: $enumDecode(_$MembershipStatusEnumMap, json['status']),
);

Map _$MemberDtoToJson(MemberDto instance) => {
'userId': instance.userId,
'status': _$MembershipStatusEnumMap[instance.status]!,
};

const _$MembershipStatusEnumMap = {
MembershipStatus.active: 'active',
MembershipStatus.invited: 'invited',
MembershipStatus.notYetSent: 'notYetSent',
MembershipStatus.rejected: 'rejected',
MembershipStatus.left: 'left',
MembershipStatus.removed: 'removed',
MembershipStatus.none: 'none',
};
```

### Flutter Version
Flutter 3.13.8 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 6c4930c4ac (11 days ago) • 2023-10-18 10:57:55 -0500
Engine • revision 767d8c75e8
Tools • Dart 3.1.4 • DevTools 2.25.0

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.