Jon*_*nas 7 dart flutter json-serialization
我正在尝试为一个对象生成 json 辅助函数,该函数包含一个具有抽象类类型的列表,如下所示:
\nimport '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}\nRun 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\nRun Code Online (Sandbox Code Playgroud)\nabstract class ExerciseRoutine {}\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n这是有道理的,因为ExerciseRoutine没有实现toJson函数和fromJson工厂。也许我可以toJson向我的抽象类添加一个函数,但如何修复丢失的fromJson工厂?
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)
| 归档时间: |
|
| 查看次数: |
5762 次 |
| 最近记录: |