我正在尝试将对象“ Week”转换为json。
https://flutter.dev/docs/development/data-and-backend/json这是我使用的来源
class Week{
DateTime _startDate;
DateTime _endDate;
List<Goal> _goalList;
String _improvement;
Week(this._startDate, this._endDate){
this._goalList = List<Goal>();
this._improvement = "";
}
Week.fromJson(Map<String, dynamic> json)
: _startDate = json['startDate'],
_endDate = json['endDate'],
_goalList = json['goalList'],
_improvement = json['improvement'];
Map<String, dynamic> toJson() =>
{
'startDate': _startDate,
'endDate': _endDate,
'goalList': _goalList,
'improvement': _improvement,
};
}
我用了这个:
DateTime startDate = currentDate.subtract(new Duration(days:(weekday-1)));
DateTime endDate = currentDate.add(new Duration(days:(7-weekday)));
Week week = new Week(startDate, endDate);
var json = jsonEncode(week);
但是问题是我得到了这个结果:
Unhandled Exception: Converting object to an encodable object failed: Instance of 'Week'
#0 _JsonStringifier.writeObject (dart:convert/json.dart:647:7)
#1 _JsonStringStringifier.printOn (dart:convert/json.dart:834:17)
#2 _JsonStringStringifier.stringify (dart:convert/json.dart:819:5)
#3 JsonEncoder.convert (dart:convert/json.dart:255:30)
#4 JsonCodec.encode (dart:convert/json.dart:166:45)
#5 jsonEncode (dart:convert/json.dart:80:10)
答案 0 :(得分:0)
jsonEncode需要一个Map<String, dynamic>
,而不是Weak
对象。调用您的toJson()
方法即可解决问题。
var json = jsonEncode(week.toJson());
但是,请记住,您的toJson()
方法也不正确,因为_goalList和日期之类的内容仍然是对象,而不是Maps或Lists。您还需要在这些方法上实现toJson方法。
答案 1 :(得分:0)
对于任何想知道的人:我都有解决方案。
要使代码正常工作,我还需要在类toJson()
上实现Goal
方法(因为我在List<Goal>
中使用了Week
)。
class Goal{
String _text;
bool _reached;
Map<String, dynamic> toJson() =>
{
'text': _text,
'reached': _reached,
};
}
此外,我需要像.toIso8601String()
类中一样,向DateTime
对象中添加Week
:
Map<String, dynamic> toJson() =>
{
'startDate': _startDate.toIso8601String(),
'endDate': _endDate.toIso8601String(),
'goalList': _goalList,
'improvement': _improvement,
};
现在输出为:
{"startDate":"2019-05-27T00:00:00.000Z","endDate":"2019-06-02T00:00:00.000Z","goalList":[],"improvement":""}
答案 2 :(得分:-1)
此代码应该有效。
// Generated by 'yaml2podo'
// Version: 0.1.2
// https://pub.dev/packages/yaml2podo
final _jc = _JsonConverter();
class Goal {
bool reached;
String text;
Goal();
factory Goal.fromJson(Map map) {
var result = Goal();
result.reached = map['reached'] as bool;
result.text = map['text'] as String;
return result;
}
Map<String, dynamic> toJson() {
var result = <String, dynamic>{};
result['reached'] = reached;
result['text'] = text;
return result;
}
}
class Week {
DateTime endDate;
DateTime startDate;
String improvement;
List<Goal> goalList;
Week();
factory Week.fromJson(Map map) {
var result = Week();
result.endDate = _jc.toDateTime(map['endDate']);
result.startDate = _jc.toDateTime(map['startDate']);
result.improvement = map['improvement'] as String;
result.goalList =
_jc.toList(map['goalList'], (e) => Goal.fromJson(e as Map));
return result;
}
Map<String, dynamic> toJson() {
var result = <String, dynamic>{};
result['endDate'] = _jc.fromDateTime(endDate);
result['startDate'] = _jc.fromDateTime(startDate);
result['improvement'] = improvement;
result['goalList'] = _jc.fromList(goalList, (e) => e.toJson());
return result;
}
}
class _JsonConverter {
String fromDateTime(dynamic data) {
if (data == null) {
return null;
}
if (data is DateTime) {
return data.toIso8601String();
}
return data as String;
}
List fromList(dynamic data, dynamic Function(dynamic) toJson) {
if (data == null) {
return null;
}
var result = [];
for (var element in data) {
var value;
if (element != null) {
value = toJson(element);
}
result.add(value);
}
return result;
}
Map<String, dynamic> fromMap(dynamic data, dynamic Function(dynamic) toJson) {
if (data == null) {
return null;
}
var result = <String, dynamic>{};
for (var key in data.keys) {
var value;
var element = data[key];
if (element != null) {
value = toJson(element);
}
result[key.toString()] = value;
}
return result;
}
DateTime toDateTime(dynamic data) {
if (data == null) {
return null;
}
if (data is String) {
return DateTime.parse(data);
}
return data as DateTime;
}
double toDouble(dynamic data) {
if (data == null) {
return null;
}
if (data is int) {
return data.toDouble();
}
return data as double;
}
List<T> toList<T>(dynamic data, T Function(dynamic) fromJson) {
if (data == null) {
return null;
}
var result = <T>[];
for (var element in data) {
T value;
if (element != null) {
value = fromJson(element);
}
result.add(value);
}
return result;
}
Map<K, V> toMap<K extends String, V>(
dynamic data, V Function(dynamic) fromJson) {
if (data == null) {
return null;
}
var result = <K, V>{};
for (var key in data.keys) {
V value;
var element = data[key];
if (element != null) {
value = fromJson(element);
}
result[key.toString() as K] = value;
}
return result;
}
}