dart 2.12后反射被移除了,所以json转换没有其他语言那么容易,也只有基础类型能直接 进行json转换,对于复杂的自定义类型,需要自己实现fromJson和toJson方法。
复杂对象json数据互转
class Area {
String name = '';
String href = '';
String code = '';
String categorize = '';
List<Area> area = [];
Area(this.name, this.href, this.code, this.categorize);
factory Area.fromJson(Map<String, dynamic> json) {
return Area(
json['name'] ?? '',
json['href'] ?? '',
json['code'] ?? '',
json['categorize'] ?? '',
)..area = (json['area'] as List<dynamic>).map((areaJson) => Area.fromJson(areaJson)).toList();
}
Map<String, dynamic> toJson() {
final map = {
'name': name,
'code': code,
'categorize': categorize,
'area': area.map((a) => a.toJson()).toList(),
};
return map;
}
@override
String toString() {
return jsonEncode(this);
}
}
- jsonEncode会自动调用toJson方法,所以需要把对象转成Map<String, dynamic>,例子中比较特别的它的属性也是自定义类型,所以在转换的时候还需要调用它的toJson方法,将其转换成List<Map<String, dynamic>>.
- fromJson中难点在于需要遍历list,将每项再通过Area.fromJson转成需要的类型。
范型对象json数据互转
class Result<T> {
bool success = false;
T? data;
Result.fromJson(dynamic json, T Function(dynamic) fromJson) {
Map<String, dynamic> jsonObject;
if (json == null) {
return;
} else if (json is String) {
jsonObject = jsonDecode(json);
} else {
jsonObject = json;
}
success = jsonObject['success'];
data = jsonObject['data'] != null ? fromJson(jsonObject['data']) : null;
}
Map<String, dynamic> toJson() {
final map = {
'success': success,
'data': data,
};
return map;
}
@override
String toString() {
return jsonEncode(this);
}
}
var result = Result<Area>.fromJson('{...具体的json字符串}', Area.fromJson)
范型和上面复杂类型比较相似,不同点在于,由于dart没有反射了,需要传递一个范型的工厂方法。