toJson 无法正常工作 json 序列化程序未处理的异常:无效参数:“DietMo​​del”的实例

Posted

技术标签:

【中文标题】toJson 无法正常工作 json 序列化程序未处理的异常:无效参数:“DietMo​​del”的实例【英文标题】:toJson not working properly json serializer Unhandled Exception: Invalid argument: Instance of 'DietModel' 【发布时间】:2021-07-12 07:27:03 【问题描述】:

我正在尝试将数据保存在 Firestore 中,但在保存到 toJson 时出错。我创建了两个模型 Diet-model 和 TargetModel 使用 json_serializable: ^4.0.0 和 json_annotation: ^4.0.0 存储在 Firestore 上。 TargetModel 有饮食模型列表。 error 是运行时错误

错误:

Unhandled Exception: Invalid argument: Instance of 'DietModel'
[        ] E/flutter (23502): #0      convertPlatformException (package:cloud_firestore_platform_interface/src/method_channel/utils/exception.dart:13:5)
[        ] E/flutter (23502): #1      MethodChannelDocumentReference.set (package:cloud_firestore_platform_interface/src/method_channel/method_channel_document_reference.dart:43:13)
[        ] E/flutter (23502): <asynchronous suspension>
[        ] E/flutter (23502): #2      DietPageRepositoryImpl.setTarget (package:dance/services/firestore/firestore-impl/diet-page-repository-impl.dart:31:5)
[        ] E/flutter (23502): <asynchronous suspension>
[        ] E/flutter (23502): #3      DietPageViewModel.setTargetedModel (package:dance/viewmodels/diet-page-view-model/diet-page-view-model.dart:120:5)
[        ] E/flutter (23502): <asynchronous suspension>

import 'package:dance/models/diet-model/diet-model.dart';
import 'package:json_annotation/json_annotation.dart';

part 'targeted-model.g.dart';

@JsonSerializable()
class TargetedModel 
  List<DietModel> targetedBreakfast;
  List<DietModel> targetedLunch;
  List<DietModel> targetedSnacks;
  List<DietModel> targetedDinner;

  TargetedModel(this.targetedBreakfast, this.targetedLunch, this.targetedSnacks,
      this.targetedDinner);

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

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


import 'package:json_annotation/json_annotation.dart';

part 'diet-model.g.dart';

@JsonSerializable()
class DietModel 
  int calories;
  String name;
  int carbs;
  int fat;
  int protein;
  bool selected;
  int quantity;
  String imageUrl;

  DietModel();

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

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


Future<void> setTarget(DateTime date, TargetedModel model) async 
    await _collectionReferenceTD.doc("$date").set(model.toJson()); // getting error here 
  

【问题讨论】:

【参考方案1】:

添加 @JsonSerializable(explicitToJson: true)

这允许嵌套对象被序列化

您可能还想更新您的 DietMo​​del 构造函数:

  DietModel(this.calories, this.name...

【讨论】:

以上是关于toJson 无法正常工作 json 序列化程序未处理的异常:无效参数:“DietMo​​del”的实例的主要内容,如果未能解决你的问题,请参考以下文章

JSON.stringify(),JSON.parse(),toJSON()方法使用

将实体框架对象序列化为 JSON

JSON 解析错误:缺少对象成员的名称

在项目中是否有任何合理的方法将json_serializable模型和build_value模型进行混合?

Gson toJson(),奇怪的行为(产生空的 json)

JS JSON.stringify 详解