json - 如何在Dart中定义一个属性可以为null或另一个模型的模型

标签 json flutter dart model

我正在构建Flutter应用程序,定义模型时遇到了一些麻烦。我有具有某些属性的模型。这些属性之一可以为null或另一模型。

import 'package:proef/models/worked_time.dart';

class Shift {
  String uuid;
  DateTime start_at;
  DateTime end_at;
  String title;
  String comment;
  WorkedTime worked_time;

  Shift(
      {this.uuid,
      this.start_at,
      this.end_at,
      this.title,
      this.comment,
      this.worked_time});

  factory Shift.fromData(Map<String, dynamic> parsedJson) {
    print(parsedJson);
    return Shift(
        uuid: parsedJson['uuid'],
        start_at: DateTime.parse(parsedJson['start_at']).toLocal(),
        end_at: DateTime.parse(parsedJson['end_at']).toLocal(),
        title: parsedJson['title'],
        comment: parsedJson['comment'],
        worked_time: parsedJson['worked_time'] == null
            ? null
            : parsedJson['worked_time']);
  }
}
这是行不通的。当我使用此模型时,会引发以下错误:
Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'WorkedTime'
我已经呆了几个小时了,不知道如何解决这个问题。 Dart和Flutter相当新。有人可以在这里帮助我吗?任何帮助将非常感激。
WorkedTime模型:
class WorkedTime {
  String uuid;
  String comment;
  int status;
  int took_break;
  DateTime start_at;
  DateTime end_at;

  WorkedTime({
    this.uuid,
    this.comment,
    this.status,
    this.took_break,
    this.start_at,
    this.end_at,
  });

  factory WorkedTime.fromData(Map<String, dynamic> parsedJson) {
    print(parsedJson);
    return WorkedTime(
        uuid: parsedJson['uuid'],
        comment: parsedJson['comment'],
        status: parsedJson['status'],
        took_break: parsedJson['took_break'],
        start_at: DateTime.parse(parsedJson['start_at']),
        end_at: DateTime.parse(parsedJson['end_at']));
  }
}
具有work_time的JSON
[
    {
        "uuid": "706f40e7-d57c-470c-9023-b0c58e2c7c3a",
        "start_at": "2020-09-01T08:00:00.000000Z",
        "end_at": "2020-09-01T16:00:00.000000Z",
        "title": "Test",
        "comment": "Test",
        "worked_time": {
            "uuid": "6e73b4aa-d6e1-41f7-86cb-09745d2db033",
            "comment": "Test",
            "status": 0,
            "break": 0,
            "start_at": "2020-09-01T08:00:00.000000Z",
            "end_at": "2020-09-01T16:00:00.000000Z",
            "took_break": 0
        }
    }
]
不包含work_time的JSON
[
    {
        "uuid": "706f40e7-d57c-470c-9023-b0c58e2c7c3a",
        "start_at": "2020-09-01T08:00:00.000000Z",
        "end_at": "2020-09-01T16:00:00.000000Z",
        "title": "Test",
        "comment": "Test",
        "worked_time": null
    }
]

最佳答案

你能试试这个模型吗

// To parse this JSON data, do
//
//     final shift = shiftFromJson(jsonString);

import 'dart:convert';

List<Shift> shiftFromJson(String str) => List<Shift>.from(json.decode(str).map((x) => Shift.fromJson(x)));

String shiftToJson(List<Shift> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));

class Shift {
    Shift({
        this.uuid,
        this.startAt,
        this.endAt,
        this.title,
        this.comment,
        this.workedTime,
    });

    String uuid;
    DateTime startAt;
    DateTime endAt;
    String title;
    String comment;
    WorkedTime workedTime;

    factory Shift.fromJson(Map<String, dynamic> json) => Shift(
        uuid: json["uuid"] == null ? null : json["uuid"],
        startAt: json["start_at"] == null ? null : DateTime.parse(json["start_at"]),
        endAt: json["end_at"] == null ? null : DateTime.parse(json["end_at"]),
        title: json["title"] == null ? null : json["title"],
        comment: json["comment"] == null ? null : json["comment"],
        workedTime: json["worked_time"] == null ? null : WorkedTime.fromJson(json["worked_time"]),
    );

    Map<String, dynamic> toJson() => {
        "uuid": uuid == null ? null : uuid,
        "start_at": startAt == null ? null : startAt.toIso8601String(),
        "end_at": endAt == null ? null : endAt.toIso8601String(),
        "title": title == null ? null : title,
        "comment": comment == null ? null : comment,
        "worked_time": workedTime == null ? null : workedTime.toJson(),
    };
}

class WorkedTime {
    WorkedTime({
        this.uuid,
        this.comment,
        this.status,
        this.workedTimeBreak,
        this.startAt,
        this.endAt,
        this.tookBreak,
    });

    String uuid;
    String comment;
    int status;
    int workedTimeBreak;
    DateTime startAt;
    DateTime endAt;
    int tookBreak;

    factory WorkedTime.fromJson(Map<String, dynamic> json) => WorkedTime(
        uuid: json["uuid"] == null ? null : json["uuid"],
        comment: json["comment"] == null ? null : json["comment"],
        status: json["status"] == null ? null : json["status"],
        workedTimeBreak: json["break"] == null ? null : json["break"],
        startAt: json["start_at"] == null ? null : DateTime.parse(json["start_at"]),
        endAt: json["end_at"] == null ? null : DateTime.parse(json["end_at"]),
        tookBreak: json["took_break"] == null ? null : json["took_break"],
    );

    Map<String, dynamic> toJson() => {
        "uuid": uuid == null ? null : uuid,
        "comment": comment == null ? null : comment,
        "status": status == null ? null : status,
        "break": workedTimeBreak == null ? null : workedTimeBreak,
        "start_at": startAt == null ? null : startAt.toIso8601String(),
        "end_at": endAt == null ? null : endAt.toIso8601String(),
        "took_break": tookBreak == null ? null : tookBreak,
    };
}

关于json - 如何在Dart中定义一个属性可以为null或另一个模型的模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63901383/

相关文章:

javascript - 如何在 PHP 中解析嵌套数组中的 JSON 数据

gradle - 运行Gradle时出错[无法解析所有工件以进行配置]

flutter - 如何分别为 Flutter web 和 mobile 添加包?

dart - 为什么等待 dart 中的 path_provider?

flutter - 将逗号插入字符串 flutter

python - 如何将博客内容导出为 JSON?

jquery - 如何从json对象中提取字符串键和值

flutter - 如何自定义 flutter 中的开关按钮

redux - 如FlutterByExample中所述,无法使用flutter,redux和firebase-auth登录

java - 在 Java 中解析 GitHub API 响应