我正在尝试为一个对象生成我的json助手函数,该对象包含一个具有抽象类类型的列表,如下所示:
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);
} 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);
}abstract class ExerciseRoutine {}这样我就会得到这个错误:
[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工厂呢?
发布于 2020-04-06 20:00:16
我通过为exercises字段编写一个自定义的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();
}https://stackoverflow.com/questions/61042910
复制相似问题