parseJsonStr method
Implementation
void parseJsonStr(
Map<String, dynamic> data, List<Class> clazz, String className) {
final keyList = data.keys.toList();
final classBuilder = Class((c) {
c.name = className;
c.fields.addAll(keyList.map<Field>((key) {
return Field((ff) {
ff.name = key;
ff.modifier = FieldModifier.final$;
ff.annotations.add(refer('JsonKey(name: "$key")'));
final value = data[key];
//基础类型无需处理
if (isBasicDataType(value)) {
ff.type = refer(data[key].runtimeType.toString());
if (value is String && parserString != null) {
ff.annotations.clear();
ff.annotations
.add(refer('JsonKey(name: "$key",fromJson:$parserString)'));
}
if (value is bool && parserBool != null) {
ff.annotations.clear();
ff.annotations
.add(refer('JsonKey(name: "$key",fromJson:$parserBool)'));
}
if (value is int && parserInt != null) {
ff.annotations.clear();
ff.annotations
.add(refer('JsonKey(name: "$key",fromJson:$parserInt)'));
}
if (value is double && parserDouble != null) {
ff.annotations.clear();
ff.annotations
.add(refer('JsonKey(name: "$key",fromJson:$parserDouble)'));
}
}
//非基础类型 - Map
else if (value is Map) {
final String childClassName = "$className${key.capitalize()}Model";
parseJsonStr(data[key], clazz, childClassName);
ff.type = refer(childClassName);
}
//非基础类型 - List
else if (value is List) {
// final listData = data[key];
if (value.isEmpty) {
ff.type = refer("List");
}
//List - 基础类型
else if (isBasicDataType(value.first)) {
ff.type = refer("List<${value.first.runtimeType.toString()}>");
}
//List - Map类型
else if (value.first is Map) {
final String childClassName =
"$className${key.capitalize()}Model";
parseJsonStr(value.first, clazz, childClassName);
ff.type = refer("List<$childClassName>");
}
//List - List类型
else if (value.first is List) {
ff.type = refer(value.runtimeType.toString());
}
}
else if(value == null){
ff.type = refer("dynamic");
}
});
}).toList());
c.annotations.add(refer("JsonSerializable()"));
// 先添加默认构造方法
c.constructors.add(Constructor((mm) {
mm.requiredParameters.addAll(keyList.map((e) => Parameter((p) {
p.toThis = true;
p.name = e;
})));
}));
//fromJson方法
c.constructors.add(Constructor((mm) {
mm.factory = true;
mm.lambda = true;
mm.name = "fromJson";
mm.requiredParameters.add(Parameter((p) => p
..name = "srcJson"
..type = refer("Map<String, dynamic>")));
mm.body = Code("_\$${c.name}FromJson(srcJson)");
}));
//toJson方法
c.methods.add(Method((mm) {
mm.name = "toJson";
mm.returns = refer("Map<String, dynamic>");
mm.lambda = true;
mm.body = Code("_\$${c.name}ToJson(this)");
}));
// ..types.addAll(element.typeParameters.map((e) => refer(e.name)));
// c.methods.addAll(_parseMethods(element));
// c.on = Reference(_generateTypeParameterizedName(element));
});
clazz.add(classBuilder);
}