我有一个应用程序,我试图将用户输入的自定义对象转换为JSON,以便将它们存储在共享的首选项中。
每个对象都是一个“解析”,具有多个属性类型(日期、颜色等.)我没问题把它转化。到目前为止还不错..。
我的问题是,它的一个属性是一个‘承诺’类型的列表。“提交”是另一个自定义对象,它还具有许多不同类型的属性(日期、双值、字符串等)。
我发现我不能简单地将整个list属性转换为一个字符串并返回,我需要对列表中每个承诺中的所有单独属性运行一个特定的转换。
所以我基本上有一个嵌套转换要求..。
我的“解决方案”的代码如下
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();
}
}这是完美的工作除了当涉及到列表承诺属性..。如您所见,我编写了以下方法
convertCommitmentsToJSON(commitments) {
for (Commitment commitment in commitments) {
commitment.toMap();
}
}我认为,通过循环遍历列表内容并应用我在converting类中创建的转换方法,可以成功地将列表转换为JSON。
假设我已经解决了一半的问题(我可能不觉得可以随意插嘴),我的问题是将JSON转换回承诺对象的列表.
我试过以下..。
convertCommitmentsFromJSON(List<Commitment> list) {
for (Commitment commitment in list) {
commitment.fromMap(jsonDecode(commitment));
}
}...but我收到消息‘静态方法’'fromMap‘不能通过实例访问’
我的(简化)承诺类的内容如有帮助,如下所示
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;
}
}发布于 2022-01-15 12:23:15
在凯文的帮助下终于解决了。撇开语法不谈,我忽略了一件关键的事情,那就是我实际上并没有返回这个函数的原始版本中的列表。我只是简单地循环,对输出什么也不做。
凯文,谢谢你的协助。(最后到达那里!)
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;
}发布于 2022-01-13 19:28:54
要访问静态函数,需要使用类名,而不是实例。
Commitment.fromMap(jsonDecode(commitment));FYI:大会是fromJson和toJson
另外:最好让fromMap成为一个工厂构造函数..。再来一次,大会。
factory Commitment.fromJson(Map<String, dynamic> json) => Commitment(
description: json['description'],
endDate: DateTime.tryParse(json['endDate']),
);https://stackoverflow.com/questions/70700952
复制相似问题