k-paxian / dart-json-mapper

Serialize / Deserialize Dart Objects to / from JSON
https://pub.dev/packages/dart_json_mapper
Other
400 stars 33 forks source link

Serialize generic type. #219

Closed xVemu closed 1 year ago

xVemu commented 1 year ago

Hi, I want to have a generic page wrapper. My Pageable class has generic List property and extends ListBase. Is it possible to deserialize JSON into a Pageable object with proper generic type passed to a deserialize function?

Example:

pageable.dart ```dart import 'dart:collection'; import 'package:dart_json_mapper/dart_json_mapper.dart'; @jsonSerializable @Json(processAnnotatedMembersOnly: true) class Pageable extends ListBase { @JsonProperty() final List data; @jsonProperty final int page; @jsonProperty final int pageSize; @jsonProperty final int totalCount; Pageable({ required this.page, required this.pageSize, required this.totalCount, required this.data, }); @override set length(int newLength) { data.length = newLength; } bool get isLast => data.length < pageSize; @override int get length => data.length; @override E operator [](int index) => data[index]; @override void operator []=(int index, E value) { data[index] = value; } } ```
main.dart ```dart import 'package:dart_json_mapper/dart_json_mapper.dart'; import 'main.mapper.g.dart'; void main() { initializeJsonMapper(); // Data should be Pageable. final data = JsonMapper.deserialize>(someJsonData); } ```
news.json ```json { "page": 1, "pageSize": 10, "totalPages": 1, "totalCount": 2, "data": [ ... ], } ```

When I try to do that, I get this error:

type 'List<dynamic>' is not a subtype of type 'Map<dynamic, dynamic>'
package:dart_json_mapper/src/mapper.dart 954:9   JsonMapper._deserializeObject
package:dart_json_mapper/src/mapper.dart 728:13  JsonMapper._enumerateConstructorParameters
package:dart_json_mapper/src/mapper.dart 768:5   JsonMapper._getNamedArguments
package:dart_json_mapper/src/mapper.dart 967:9   JsonMapper._deserializeObject
package:dart_json_mapper/src/mapper.dart 53:21   JsonMapper.deserialize
k-paxian commented 1 year ago

Here is the sample how to deal with generics + models. To be honest that's make them not really generic anymore, but it's possible to mitigate that issue. Sorry have no time to put up a working code for your case 🤷