Dart JsonSerialized 与抽象类

Jon*_*nas 7 dart flutter json-serialization

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

\n
import 'package:json_annotation/json_annotation.dart';\n\nimport 'exercise-variations.a.dart';\n\npart 'routine.model.g.dart';\n\n@JsonSerializable()\nclass Routine {\n\n  List<ExerciseRoutine> exercises;\n\n  Routine();\n\n  factory Routine.fromJson(Map<String, dynamic> json) => _$RoutineFromJson(json);\n\n  Map<String, dynamic> toJson() => _$RoutineToJson(this);\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n    import 'package:json_annotation/json_annotation.dart';\n    import 'exercise-variations.a.dart';\n\n    part 'base-exercise-routine.g.dart';\n\n    @JsonSerializable()\n    class BaseExerciseRoutine implements ExerciseRoutine {\n      int sets;\n\n      BaseExerciseRoutine();\n\n      factory BaseExerciseRoutine.fromJson(Map<String, dynamic> json) => _$BaseExerciseRoutineFromJson(json);\n\n      Map<String, dynamic> toJson() => _$BaseExerciseRoutineToJson(this);\n    }\n\n
Run Code Online (Sandbox Code Playgroud)\n
abstract class ExerciseRoutine {}\n
Run Code Online (Sandbox Code Playgroud)\n

这样我得到这个错误:

\n
[INFO] Running build...\n[SEVERE] json_serializable:json_serializable on lib/test/routine.model.dart:\nError running JsonSerializableGenerator\nCould not generate `fromJson` code for `exercises` because of type `ExerciseRoutine`.\nNone of the provided `TypeHelper` instances support the defined type.\npackage:dojohub_app_flutter/test/routine.model.dart:11:25\n   \xe2\x95\xb7\n11 \xe2\x94\x82   List<ExerciseRoutine> exercises;\n   \xe2\x94\x82                         ^^^^^^^^^\n   \xe2\x95\xb5\n[INFO] Running build completed, took 1.2s\n\n[INFO] Caching finalized dependency graph...\n[INFO] Caching finalized dependency graph completed, took 92ms\n\n[SEVERE] Failed after 1.3s\npub finished with exit code 1\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

Jon*_*nas 9

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

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();
}
Run Code Online (Sandbox Code Playgroud)