Flutter 之 json_annotation 和 json_serializable使用

插件介绍

json_annotationjson_serializable:是负责序列化和反序列化的; json_serializable, 可自动生产反序列化代码;

dependencies:
  flutter:
    sdk: flutter
  json_annotation: ^3.0.0
  cupertino_icons: ^0.1.2

dev_dependencies:
  flutter_test:
    sdk: flutter
  json_serializable: ^3.2.0
  build_runner: ^1.6.5 # 用于自动生成代码

编写创建对象代码

  • 利用大佬写的工具json2dart

    Flutter 之 json_annotation 和 json_serializable使用_第1张图片
    json2dart

  • 创建对象文件, 并复制上面的代码, 粘贴进去


    Flutter 之 json_annotation 和 json_serializable使用_第2张图片
    创建对象文件, 并复制上面的代码, 粘贴进去
  • 执行命令flutter packages pub run build_runner build lib进行一次性构建,效率比较低

  • 执行命令flutter packages pub run build_runner watch lib这个命令可以实时文件监听,自动创建实体类生成对应的.g.dart文件。

Flutter 之 json_annotation 和 json_serializable使用_第3张图片
自动生成代码文件

使用

  • 初始化数据源
注意:创建Map时, 一定要指定类型, 不然报下面的错误:

type '_InternalLinkedHashMap' is not a subtype of type 'Map'

class _MyHomePageState extends State {
// 创建Map时, 一定要指定类型, 不然报下面的错误
  Map resDic = {};
  ResponseModel model;
  @override
  void initState() {
    super.initState();
    _initResDic();
  }
......
}
  /*初始化数据源*/
  _initResDic() {
    resDic = {
      "status": 1,
      "data": {
        "pageData": {
          "pageNum": 1,
          "curPage": 1,
          "perPage": 10
        },
        "hosList": [
          {
            "id": 190,
            "name": "阜外医院",
            "illId": 1,
            "introduction": "北京阜外医院(全名:中国医学科学院阜外心血管病医院)的前身是解放军胸科医院,始建于1956年,心血管病研究所始建于1962年,由我国胸心外科的奠基人之一吴英恺院士一手创办。北京阜外医院、心血管病研究所是隶属于卫生部、中国医学科学院、中国协和医科大学的三级甲等心血管病专科医院。",
            "level": "三甲",
            "imgurl": "https://t.duodian.api.cheng1hu.com/attachment/hospital/2019/07/01/15/0c365acdfeb18bfc0806a7a922bee800.jpg"
          }
        ]
      }
    };
  }
  • 字典转对象
  _jsonTest() {
    ResponseModel model = ResponseModel.fromJson(resDic);
    List  hosList = model.data.hosList;
    HosList hosListModel = hosList[0];
    print(hosListModel.introduction);
  }

  • 对象转字典
  /*对象转字典*/
  _objToJson() {
    var map = model.data.pageData.toJson();
    print(map);
    print(map.runtimeType);
  }
/**
打印结果:
flutter: {pageNum: 1, curPage: 1, perPage: 10}
flutter: _InternalLinkedHashMap
*/

注意: 发现toJson()只能转单层的, 对于多层嵌套的结构, 还存在bug;

  /*对象转字典*/
  _objToJson() {
    print('---------------------对象转字典---------------------');
    print(model);
    Map dic = model.toJson();
    print(dic);
    print(dic.runtimeType);
  }
/**
flutter: ---------------------对象转字典---------------------
flutter: Instance of 'ResponseModel'
flutter: {status: 1, data: Instance of 'Data'}  // 第二层对象就没办法转了.
flutter: _InternalLinkedHashMap
*/

你可能感兴趣的:(Flutter 之 json_annotation 和 json_serializable使用)