Flutter动态将JSON字符串生成dart实体类

使用方法
1.调用JSONUtil.test() 会自动生成实体类并输出实体类的日志。
测试的JSON字符串
 String jsonStr =
        "{\"time\":1654650815,\"tags\":[{\"id\":1,\"name\":\"A\",\"colors\":[\"Blue\",\"Green\"]}],\"info\":{\"ID\":1,\"name\":\"Cool\"}}";
以上测试的JSON字符串会输出如下创建实体类的日志。

flutter: class Tags {
 int id = 0; 
 String name = ""; 
 List<dynamic> colors = List.empty(growable: true); 

 Tags.fromMap(dynamic map){
 if(map == null || !(map is Map)){return;} 
 id = map["id"];
 name = map["name"];
 colors = map["colors"];

}
 static fromList(List list){
            List<Tags> datalist = List.empty(growable: true);
            if(list == null || list.length==0){
              return datalist;
            } 
            for(int i=0;i<list.length;i++){
              datalist.add(Tags.fromMap(list[i]));
            } 
            return datalist;
          
}
}
flutter: 
flutter: 
flutter: class Info {
 int ID = 0; 
 String name = ""; 
 Info.fromMap(dynamic map){
 if(map == null || !(map is Map)){return;} 
 ID = map["ID"];
 name = map["name"];
}
 static fromList(List list){
            List<Info> datalist = List.empty(growable: true);
            if(list == null || list.length==0){
              return datalist;
            } 
            for(int i=0;i<list.length;i++){
              datalist.add(Info.fromMap(list[i]));
            } 
            return datalist;
          
}
}
flutter: 
flutter: class OuterClass {
 int time = 0; 
 List<Tags> tags = List.empty(growable: true); 
 Info? info; 
 OuterClass.fromMap(dynamic map){
 if(map == null || !(map is Map)){return;} 
 time = map["time"];
 tags = Tags.fromList(map["tags"]);
 info = Info.fromMap(map["info"]);
}
 static fromList(List list){
            List<OuterClass> datalist = List.empty(growable: true);
            if(list == null || list.length==0){
              return datalist;
            } 
            for(int i=0;i<list.length;i++){
              datalist.add(OuterClass.fromMap(list[i]));
            } 
            return datalist;     
}
}

2.将生成的实体类输出日志复制到项目中建立对应的实体类文件。
3.将JSON字符串转换成Map或list调用实体类的相关方法进行转换,便可以在项目中通过实体类访问数据了。
import 'dart:convert';

import './extension/string_extension.dart';

///------------------------------------------
///将JSON字符串生成Dart实体类,并且同时生成赋值方法
///------------------------------------------
class JSONUtil {
  static test() {
    String jsonStr =
        "{\"time\":1654650815,\"tags\":[{\"id\":1,\"name\":\"A\",\"colors\":[\"Blue\",\"Green\"]}],\"info\":{\"ID\":1,\"name\":\"Cool\"}}";
    generateClass(jsonStr);
  }

  static test2() {
    String jsonStr =
        "{\"time\":1654650815,\"tags\":[{\"id\":1,\"name\":\"A\",\"colors\":[\"Blue\",\"Green\"]}],\"info\":{\"ID\":1,\"name\":\"Cool\"}}";

    // dynamic obj = jsonDecode(jsonStr);
    // OuterClass map = OuterClass.fromMap(obj);
    // print("map = $map.length");
  }

  static generateClass(String json) {
    dynamic obj = jsonDecode(json);
    if (obj is Map) {
      convertMapToObject(obj, "OuterClass");
    } else if (obj is List) {
      if (obj.length > 0) {
        dynamic temp = obj[0];
        if (temp is Map) {
          convertMapToObject(temp, "OuterClass");
        }
      }
    }
  }

  static convertMapToObject(Map map, String mapName) {
    //
    print("\n\n");
    String objectStr = "class $mapName {\n";

    String setValue = "";
    //属性
    for (var key in map.keys) {
      dynamic val = map[key];
      if (val == null) {
        continue;
      }
      String fieldSt = "";
      var keyUpper = key.toString().capitalize();

      if (val is int) {
        fieldSt = "int $key = 0;";
      } else if (val is double) {
        fieldSt = "double $key = 0.0;";
      } else if (val is String) {
        fieldSt = "String $key = \"\";";
      } else if (val is Map) {
        fieldSt = "$keyUpper? $key;";
        convertMapToObject(val, keyUpper);
      } else if (val is List) {
        List list = val as List;
        if (list.length > 0) {
          dynamic item = list[0];
          if (item is Map) {
            convertMapToObject(item, keyUpper);
            fieldSt = "List<$keyUpper> $key = List.empty(growable: true);";
          } else {
            fieldSt = "List<dynamic> $key = List.empty(growable: true);";
          }
        }
      }

      if (val is Map) {
        setValue = "$setValue $key = $keyUpper.fromMap(map[\"$key\"]);\n";
      } else if (val is List) {
        if (val.isNotEmpty) {
          dynamic item = val[0];
          if (item is Map) {
            setValue = "$setValue $key = $keyUpper.fromList(map[\"$key\"]);\n";
          } else {
            setValue = "$setValue $key = map[\"$key\"];\n";
          }
        }
      } else {
        setValue = "$setValue $key = map[\"$key\"];\n";
      }

      objectStr = "$objectStr $fieldSt \n";
    }

    //数据赋值
    //Map
    objectStr =
        "$objectStr\n $mapName.fromMap(dynamic map){\n if(map == null || !(map is Map)){return;} \n$setValue\n}";

    //List
    objectStr = """$objectStr\n static fromList(List list){\n  
            List<$mapName> datalist = List.empty(growable: true);
            if(list == null || list.length==0){
              return datalist;
            } 
            for(int i=0;i<list.length;i++){\n  
              datalist.add($mapName.fromMap(list[i]));
            } 
            return datalist;
          \n}""";

    objectStr = "$objectStr\n}";
    print(objectStr);

    print("\n\n");
  }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flutter中,你可以使用`json_serializable`库和`json_annotation`库来将JSON字符串转换为实体类。以下是一个简单的步骤: 1. 添加依赖: 在`pubspec.yaml`文件中添加以下依赖: ```yaml dependencies: json_annotation: ^4.4.0 dev_dependencies: build_runner: ^2.0.5 json_serializable: ^4.1.3 ``` 2. 创建实体类: 定义一个Dart类,使用`json_annotation`库的注解来指定JSON字段和Dart类属性之间的映射关系。例如: ```dart import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; @JsonSerializable() class User { final int id; final String name; final String email; User({required this.id, required this.name, required this.email}); factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); } ``` 注意:在创建完实体类后,需要运行一次代码生成命令以生成相应的.g.dart文件。后面会提到。 3. 运行代码生成命令: 在终端中运行以下命令,生成.g.dart文件: ```bash flutter pub run build_runner build ``` 这将根据实体类中的注解生成对应的.g.dart文件。 4. 将JSON字符串转换为实体类对象: 使用`json_serializable`库提供的fromJson方法,将JSON字符串转换为实体类对象。例如: ```dart import 'dart:convert'; String jsonString = '{"id": 1, "name": "John", "email": "john@example.com"}'; Map<String, dynamic> json = jsonDecode(jsonString); User user = User.fromJson(json); ``` 现在,你就可以通过访问`user`对象的属性来获取JSON中的值了。 这就是将JSON字符串转换为实体类的基本步骤。记得在每次修改实体类后,都要重新运行代码生成命令,以保持.g.dart文件的同步更新。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值