【发布时间】: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