JSON 转换仅适用于地图、列表、字符串、数字、布尔值或 null。那么如果你的对象包含另一种类型DateTime
呢?
日期时间 → JSON
让我们从以下对象开始:
class Person {
Person(this.name, this.birthdate);
String name;
DateTime birthdate;
}
您可以将其转换为这样的地图:
final person = Person('Bob', DateTime(2020, 2, 25));
Map<String, dynamic> map = {
'name': person.name,
'birthdate': person.birthdate,
};
如果您现在尝试使用jsonEncode
(or json.encode
) 对其进行编码,则会收到错误消息,因为DateTime
不可直接序列化。有两种解决方案。
解决方案 1
你可以先自己序列化它,如下所示:
Map<String, dynamic> map = {
'name': person.name,
'birthdate': person.birthdate.toIso8601String(),
};
final jsonString = json.encode(map);
笔记:
toString
这是和之间的区别toIso8601String
:
2020-02-25 14:44:28.534 // toString()
2020-02-25T14:44:28.534 // toIso8601String()
toIso8601String
没有任何空格,因此可以更好地进行转换和通过可能无法很好地处理空格的 API 发送。
解决方案 2
您可以toEncodable
在jsonEncode
.
import 'dart:convert';
void main() {
final person = Person('Bob', DateTime(2020, 2, 25));
Map<String, dynamic> map = {
'name': person.name,
'birthdate': person.birthdate,
};
final toJson = json.encode(map, toEncodable: myDateSerializer);
}
dynamic myDateSerializer(dynamic object) {
if (object is DateTime) {
return object.toIso8601String();
}
return object;
}
该toEncodable
函数只是将输入转换为字符串或jsonEncode
可以转换为字符串的东西。
JSON → 日期时间
这里没有什么特别的。您只需要将字符串解析为您需要的类型。在这种情况下,DateTime
您可以使用其parse
或tryParse
方法。
final myMap= json.decode(jsonString);
final name = myMap['name'];
final birthdateString = myMap['birthdate'];
final birthdate = DateTime.parse(birthdateString);
final decodedPerson = Person(name, birthdate);
请注意,parse
如果无法将字符串的格式解析为DateTime
对象,则会引发异常。
作为模型类
class Person {
Person(this.name, this.birthdate);
String name;
DateTime birthdate;
Person.fromJson(Map<String, dynamic> json)
: name = json['name'],
birthdate = DateTime.tryParse(json['birthdate']),
Map<String, dynamic> toJson() {
return {
'name': name,
'birthdate': birthdate.toIso8601String(),
};
}
}
如果日期格式错误,这不会引发异常,但birthdate
会是null
.
笔记