首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有抽象类的Dart JsonSerializable

带有抽象类的Dart JsonSerializable
EN

Stack Overflow用户
提问于 2020-04-05 20:53:24
回答 1查看 1.7K关注 0票数 2

我正在尝试为一个对象生成我的json助手函数,该对象包含一个具有抽象类类型的列表,如下所示:

代码语言:javascript
复制
import 'package:json_annotation/json_annotation.dart';

import 'exercise-variations.a.dart';

part 'routine.model.g.dart';

@JsonSerializable()
class Routine {

  List<ExerciseRoutine> exercises;

  Routine();

  factory Routine.fromJson(Map<String, dynamic> json) => _$RoutineFromJson(json);

  Map<String, dynamic> toJson() => _$RoutineToJson(this);
}
代码语言:javascript
复制
    import 'package:json_annotation/json_annotation.dart';
    import 'exercise-variations.a.dart';

    part 'base-exercise-routine.g.dart';

    @JsonSerializable()
    class BaseExerciseRoutine implements ExerciseRoutine {
      int sets;

      BaseExerciseRoutine();

      factory BaseExerciseRoutine.fromJson(Map<String, dynamic> json) => _$BaseExerciseRoutineFromJson(json);

      Map<String, dynamic> toJson() => _$BaseExerciseRoutineToJson(this);
    }
代码语言:javascript
复制
abstract class ExerciseRoutine {}

这样我就会得到这个错误:

代码语言:javascript
复制
[INFO] Running build...
[SEVERE] json_serializable:json_serializable on lib/test/routine.model.dart:
Error running JsonSerializableGenerator
Could not generate `fromJson` code for `exercises` because of type `ExerciseRoutine`.
None of the provided `TypeHelper` instances support the defined type.
package:dojohub_app_flutter/test/routine.model.dart:11:25
   ╷
11 │   List<ExerciseRoutine> exercises;
   │                         ^^^^^^^^^
   ╵
[INFO] Running build completed, took 1.2s

[INFO] Caching finalized dependency graph...
[INFO] Caching finalized dependency graph completed, took 92ms

[SEVERE] Failed after 1.3s
pub finished with exit code 1

这是有道理的,因为ExerciseRoutine没有实现toJson函数和fromJson工厂。也许我可以向我的抽象类添加一个toJson函数,但是我如何修复缺少的fromJson工厂呢?

EN

回答 1

Stack Overflow用户

发布于 2020-04-06 20:00:16

我通过为exercises字段编写一个自定义的fromJson和toJson函数解决了这个问题

代码语言:javascript
复制
part 'routine.model.g.dart';

@JsonSerializable()
class Routine extends WorkoutRoutine {

  @JsonKey(fromJson: exercisesFromJson, toJson: exercisesToJson)
  List<ExerciseRoutine> exercises;

  Routine();

  factory Routine.fromJson(Map<String, dynamic> json) => _$RoutineFromJson(json);

  Map<String, dynamic> toJson() => _$RoutineToJson(this);
}

List<ExerciseRoutine> exercisesFromJson(List<dynamic> json) {
  return json.map((e) {
    return BaseExerciseRoutine.fromJson(e);
  }).toList();
}

List<dynamic> exercisesToJson(List<ExerciseRoutine> exercises) {
  return exercises.map((e) {
    switch (exercises.runtimeType) {
      case BaseExerciseRoutine:
        return (e as BaseExerciseRoutine).toJson();
      default:
        return null;
        break;
    }
  }).toList();
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61042910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档