Библиотека Dart json_serializable пытается передать вложенным типизированным спискам список <dynamic> - PullRequest
1 голос
/ 02 мая 2020

Просто начать работу с пакетом json_serializable (и Dart в целом). Я столкнулся с проблемой, когда моя простая сущность взрывается при попытке инициализировать ее с JSON. Возвращенная ошибка trying to assign a List<dynamic> to a List<Asset>.

test('Test AssetSearch Response Handling', () {
    String json = """{"recordsTotal":0,"recordsFiltered":0,"data":[{
          "assetType": "ASSET",
          "description": "A Case of Surgical Masks",
          "partNumber": "PN183289283",
          "serialNumber": "SN123"
        }]}""";
    AssetSearchResult result = AssetSearchResult.fromJson(jsonDecode(json));
    expect(result.recordsTotal, equals(0));
    print("data returned was ${result.data}");
    expect(result.data.isEmpty, equals(true));
});

Класс Asset выглядит следующим образом:

@JsonSerializable()
class AssetSearchResult {
  int recordsTotal;
  int recordsFiltered;
  List<Asset> data;

  Map<String, dynamic> toJson() => _$AssetSearchResultToJson(this);
  static fromJson(Map<String, dynamic> json) => _$AssetSearchResultFromJson(json);
}

... и, наконец, сгенерированный код из json_serializer:


AssetSearchResult _$AssetSearchResultFromJson(Map<String, dynamic> json) {
  return AssetSearchResult()
    ..recordsTotal = json['recordsTotal'] as int
    ..recordsFiltered = json['recordsFiltered'] as int
    ..data = (json['data'] as List)   // <== This is where things blow up...
        ?.map(
            (e) => e == null ? null : Asset.fromJson(e as Map<String, dynamic>))
        ?.toList();

Если я изменю сгенерированный код, чтобы обернуть его в правильный тип списка, все работает отлично.

    ..data = List<Asset>.from((json['data'] as List)
        ?.map(
            (e) => e == null ? null : Asset.fromJson(e as Map<String, dynamic>)));

Я не уверен, как это исправить с помощью аннотаций или в не сгенерированной части сущности, поскольку исправление находится внутри класса .g.dart.

...