首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将父对象中的自定义对象列表转换为(或从) JSON?

如何将父对象中的自定义对象列表转换为(或从) JSON?
EN

Stack Overflow用户
提问于 2022-01-13 17:50:48
回答 2查看 329关注 0票数 0

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

每个对象都是一个“解析”,具有多个属性类型(日期、颜色等.)我没问题把它转化。到目前为止还不错..。

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

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

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

我的“解决方案”的代码如下

代码语言:javascript
复制
  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();
    }
  }

这是完美的工作除了当涉及到列表承诺属性..。如您所见,我编写了以下方法

代码语言:javascript
复制
  convertCommitmentsToJSON(commitments) {
    for (Commitment commitment in commitments) {
      commitment.toMap();
    }
  }

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

假设我已经解决了一半的问题(我可能不觉得可以随意插嘴),我的问题是将JSON转换回承诺对象的列表.

我试过以下..。

代码语言:javascript
复制
  convertCommitmentsFromJSON(List<Commitment> list) {
    for (Commitment commitment in list) {
      commitment.fromMap(jsonDecode(commitment));
    }
  }

...but我收到消息‘静态方法’'fromMap‘不能通过实例访问’

我的(简化)承诺类的内容如有帮助,如下所示

代码语言:javascript
复制
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']),
      );
}

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

订正转换码

代码语言:javascript
复制
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;
    }
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-15 12:23:15

在凯文的帮助下终于解决了。撇开语法不谈,我忽略了一件关键的事情,那就是我实际上并没有返回这个函数的原始版本中的列表。我只是简单地循环,对输出什么也不做。

凯文,谢谢你的协助。(最后到达那里!)

代码语言:javascript
复制
  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;
  }
票数 0
EN

Stack Overflow用户

发布于 2022-01-13 19:28:54

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

代码语言:javascript
复制
Commitment.fromMap(jsonDecode(commitment));

FYI:大会是fromJsontoJson

另外:最好让fromMap成为一个工厂构造函数..。再来一次,大会。

代码语言:javascript
复制
factory Commitment.fromJson(Map<String, dynamic> json) => Commitment(
        description: json['description'],
        endDate: DateTime.tryParse(json['endDate']),
      );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70700952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档