Dart语言学习记录:范型和复杂类型的json互转

347 阅读1分钟

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);
  }
}
  1. jsonEncode会自动调用toJson方法,所以需要把对象转成Map<String, dynamic>,例子中比较特别的它的属性也是自定义类型,所以在转换的时候还需要调用它的toJson方法,将其转换成List<Map<String, dynamic>>.
  2. 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没有反射了,需要传递一个范型的工厂方法。