parseJsonStr method

void parseJsonStr(
  1. Map<String, dynamic> data,
  2. List<Class> clazz,
  3. String className
)

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);
}