我正在try 将对象"Week"转换为json.

这就是我用的信号源

class Week{
  DateTime _startDate;
  DateTime _endDate;
  List<Goal> _goalList;
  String _improvement;

  Week(this._startDate, this._endDate){
    this._goalList = List<Goal>();
    this._improvement = "";
  }

  Week.fromJson(Map<String, dynamic> json)
    : _startDate =  json['startDate'],
      _endDate = json['endDate'],
      _goalList = json['goalList'],
      _improvement = json['improvement'];

  Map<String, dynamic> toJson() => 
  {
    'startDate': _startDate,
    'endDate': _endDate,
    'goalList': _goalList,
    'improvement': _improvement,
  };
}

我用了这个:

DateTime startDate = currentDate.subtract(new Duration(days:(weekday-1)));
DateTime endDate = currentDate.add(new Duration(days:(7-weekday)));

Week week = new Week(startDate, endDate);
var json = jsonEncode(week);

但问题是,我得到的结果是:

Unhandled Exception: Converting object to an encodable object failed: Instance of 'Week'
#0      _JsonStringifier.writeObject (dart:convert/json.dart:647:7)
#1      _JsonStringStringifier.printOn (dart:convert/json.dart:834:17)
#2      _JsonStringStringifier.stringify (dart:convert/json.dart:819:5)
#3      JsonEncoder.convert (dart:convert/json.dart:255:30)
#4      JsonCodec.encode (dart:convert/json.dart:166:45)
#5      jsonEncode (dart:convert/json.dart:80:10)

推荐答案

jsonEncode需要Map<String, dynamic>,而不是Week对象.调用您的toJson()方法应该可以做到这一点.

var json = jsonEncode(week.toJson());

但是,请记住,您的toJson()方法也是不正确的,因为_goalList和日期等内容仍然是对象,而不是 map 或列表.您还需要在这些上实现toJson方法.

要回答您的具体问题:

  1. 因为dart不是javascript/typescript.Dart在运行时判断类型,因此您必须明确地告诉它如何转换东西——而且Dart中没有反射,所以它无法自行识别.
  2. 您可以使用使用代码生成的库来自动为您做这些事情-尽管在运行时仍然不可能-阅读更多关于JSON serialization的内容.
  3. 最简单的方法是直接在类中实现这些方法,因为您可以在根对象中访问这些方法.请记住,jsonEncode需要的 struct 是Map<String, dynamic>,但dynamic部分实际上意味着List<dynamic>Map<String, dynamic>或与json兼容的原语,如Stringdouble——如果你试图想象上述类型的嵌套 struct 是什么样子,你就会意识到它基本上是json.所以当你做类似'goalList': _goalList,的事情时,你给它一个对象,这不是允许的类型之一.

希望这能把事情弄清楚一点.

Flutter相关问答推荐

关闭视频通话,相机仍在运行!(Flutter WebRTC)

无效字符(位于字符68处)flutter—update—... europe-west1.firebasedatabase.app/

错误:找不到字体功能类型.Ffltter Google_Fonts包错误

在fltter_widget_from_html中启动url

Flutter 对齐:不适用于多行文字

使用GO_ROUTER在模式内导航

Flutter 文件拾取器Android SingleInstance模式它返回的文件路径为空

如何从RealmResults获取Flutter Flutter 流?

上传的图像不能在FireBase中预览.S档案类型为空白,摆动

当键盘隐藏表单时该怎么办?

Flutter - firebase_auth_web 5.4.0 依赖于 intl ^0.17.0 但我必须使用更高版本 (intl ^0.18.0)

如何解决需要一个标识符,但得到的是:.try 在:之前插入一个标识符.dart 错误

Flutter RIverpod 奇怪地改变状态

flutter 中 // 和 /// 有什么区别

Flutter 动画页面计数器文本

Flutter:当我通过 Transform.rotate 旋转水平 ListView 时,左右边缘被切断

Flutter Web App 未启动:脚本的 MIME 类型不受支持

type '_InternalLinkedHashMap' 不是使用 http 包的'String' 类型的子类型

如何在flutter中共享容器和gridview之间的滚动条?

如何在Flutter 中制作自定义微调器?