【问题标题】:How can I convert a list of custom objects within a parent object to (and from) JSON?如何将父对象中的自定义对象列表转换为(和从)JSON?
【发布时间】:2022-01-13 17:50:48
【问题描述】:

我有一个应用程序,我正在尝试将用户输入的自定义对象与 JSON 进行转换,以便我可以将它们存储在共享首选项中。

每个对象都是一个“解决方案”,并且具有多种属性类型(日期、颜色等),我可以毫无问题地进行转换。到目前为止一切顺利...

我的问题是它的属性之一是“承诺”类型的列表。 “承诺”是另一个自定义对象,它还具有许多不同类型(日期、双精度、字符串等)的属性。

我发现我不能简单地将整个 List 属性转换为字符串并返回,我需要为列表中每个承诺中的所有单个属性运行特定的转换。

所以我基本上有一个嵌套转换要求......

我的“RESOLUTION”代码如下

  class Resolution {
  final String id;
  String title;
  late DateTime? startDate;
  late DateTime? endDate;
  Color color;
  double progress;
  List<Commitment> commitments;
  bool isComplete;

  Resolution(
      {required this.id,
      required this.title,
      this.startDate,
      required this.endDate,
      this.color = Colors.orange,
      this.progress = 0,
      this.commitments = const [],
      this.isComplete = false});

  Map toMap() {
    return {
      'id': id,
      'title': title,
      'startDate': startDate!.toIso8601String(),
      'endDate': endDate!.toIso8601String(),
      'color': color.value.toString(),
      'progress': progress,
      'commitments': convertCommitmentsToJSON(commitments),
      'isComplete': isComplete,
    };
  }

  Resolution.fromMap(Map map)
      : id = map['id'],
        title = map['title'],
        startDate = DateTime.tryParse(map['startDate']),
        endDate = DateTime.tryParse(map['endDate']),
        color = Color(int.parse(map['color'])),
        progress = map['progress'],
        commitments = List<Commitment>.from(map['commitments']),
        isComplete = map['isComplete'];

  convertCommitmentsToJSON(commitments) {
    for (Commitment commitment in commitments) {
      commitment.toMap();
    }
  }

除了 List Commitment 属性之外,这非常有效......正如你所看到的,我已经编写了以下方法

  convertCommitmentsToJSON(commitments) {
    for (Commitment commitment in commitments) {
      commitment.toMap();
    }
  }

我认为通过循环列表内容并应用我在 COMMITMENT 类中创建的转换方法成功地将列表转换为 JSON。

假设我已经解决了一半的问题(我可能不太愿意参与其中),我的问题是将 JSON 转换回 Commitment 对象列表...

我尝试了以下...

  convertCommitmentsFromJSON(List<Commitment> list) {
    for (Commitment commitment in list) {
      commitment.fromMap(jsonDecode(commitment));
    }
  }

...但我收到消息“无法通过实例访问静态方法 'fromMap'”

如果有帮助的话,我的(简化的)COMMITMENT 类的内容如下

class Commitment {
  String description;
  DateTime? endDate;

  Commitment({required this.description, this.endDate});

  Map<String, dynamic> toMap() => {
        'description': description,
        'endDate': endDate?.toIso8601String(),
      };

  static Commitment fromMap(Map<String, dynamic> json) => Commitment(
        description: json['description'],
        endDate: DateTime.tryParse(json['endDate']),
      );
}

有人可以帮忙吗?我对编码比较陌生,所以也许我完全走错了路


修改后的转换代码

Map toJson() {
    return {
      'id': id,
      'title': title,
      'startDate': startDate!.toIso8601String(),
      'endDate': endDate!.toIso8601String(),
      'color': color.value.toString(),
      'progress': progress,
      'commitments': convertCommitmentsToJSON(commitments),
      'isComplete': isComplete,
    };
  }

  Resolution.fromJson(Map map)
      : id = map['id'],
        title = map['title'],
        startDate = DateTime.tryParse(map['startDate']),
        endDate = DateTime.tryParse(map['endDate']),
        color = Color(int.parse(map['color'])),
        progress = map['progress'],
        commitments = convertCommitmentsFromJSON(List<Commitment>.from(map['commitments'])),
        isComplete = map['isComplete'];

  convertCommitmentsToJSON(commitments) {
    for (Commitment commitment in commitments) {
      commitment.toJson();
    }
  }

   
  convertCommitmentsFromJSON(List<Commitment> list) {
    for (Commitment commitment in list) {
      Commitment.fromJson;
    }
  }

【问题讨论】:

    标签: json flutter dart sharedpreferences


    【解决方案1】:

    要访问静态函数,您需要使用类名,而不是实例

    Commitment.fromMap(jsonDecode(commitment));
    

    仅供参考:约定是fromJsontoJson

    另外:最好让fromMap 成为工厂构造函数......再次,约定。

    factory Commitment.fromJson(Map<String, dynamic> json) => Commitment(
            description: json['description'],
            endDate: DateTime.tryParse(json['endDate']),
          );
    

    【讨论】:

    • 嗨,凯文,谢谢。你能看看我添加到我的帖子中的修改后的代码吗?对于 convertCommitmentFromJSON 方法,我更改为类名而不是实例。但是,我实际上不能在主要的 Resolution.fromJSON 方法中使用该方法,因为我收到消息“实例成员 'convertCommitmentsFromJSON' 无法从初始化程序访问。我会以完全错误的方式解决这个问题吗?我只需要转换自定义对象的子列表和 fromJSON,这样我就可以将其父对象保存到共享首选项。
    • 让它成为一个静态函数——你还缺少一些返回调用和()
    【解决方案2】:

    在凯文的帮助下最终解决了。除了我缺少的一个关键的语法之外,我实际上并没有在这个函数的原始版本中返回一个列表。我只是在循环,对输出什么也不做。

    凯文,感谢您的协助。终于到了! ;)

      static List<Commitment> convertCommitmentsFromJSON(List<dynamic> list) {
        List<Commitment> commitmentsList = [];
        if (list.isNotEmpty) {
          for (var item in list) {
            Commitment commitment = Commitment.fromJson(item);
            commitmentsList.add(commitment);
          }
        }
        return commitmentsList;
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多