google / google/json_serializable.dart

[Feature request] Support dart3 sealed class

Open
#1,342 10 comments 42 reactions 0 assignees View on GitHub
Type: enhancement
Dominant language
Dart
Stars
1.6k
Forks
461
Avg merge
45m
Merged PRs (30d)
1

Description

Thank you for this package!

I failed to find any discussions about this and it feels like essential feture at this moment.

Do you have any plan to implement union-like sealed class serialization, so we can avoid using freezed?

We could use this feature something like this (inspired by freezed):

```dart
@JsonSerializable(unionKey: 'subtype') // dafualt 'runtimeType'
sealed class RootSealedClass {
const RootSealedClass();

factory RootSealedClass.fromJson(Map json) =>
_$RootSealedClassFromJson(json);

@JsonValue('first') // or literal class name as default
const factory RootSealedClass.first(String someAtribute) =
FirstSealedClassSubtype;

@JsonValue('second') // or literal class name as default
const factory RootSealedClass.second(int someOtherAtribute) =
SecondSealedClassSubtype;

Map toJson();
}

@JsonSerializable()
class FirstSealedClassSubtype extends RootSealedClass {
const FirstSealedClassSubtype(this.someAtribute);

factory FirstSealedClassSubtype.fromJson(Map json) =>
_$FirstSealedClassSubtypeFromJson(json);

final String someAtribute;

@override
Map toJson() => _$FirstSealedClassSubtypeToJson(this);
}

@JsonSerializable()
class SecondSealedClassSubtype extends RootSealedClass {
const SecondSealedClassSubtype(this.someOtherAtribute);

factory SecondSealedClassSubtype.fromJson(Map json) =>
_$SecondSealedClassSubtypeFromJson(json);

final int someOtherAtribute;

@override
Map toJson() => _$SecondSealedClassSubtypeToJson(this);
}
```

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.