美文网首页
Flutter 之 json_annotation 和 json

Flutter 之 json_annotation 和 json

作者: 壹点微尘 | 来源:发表于2019-12-02 20:12 被阅读0次

    插件介绍

    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

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


      创建对象文件, 并复制上面的代码, 粘贴进去
    • 执行命令flutter packages pub run build_runner build lib进行一次性构建,效率比较低

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

    自动生成代码文件

    使用

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

    type '_InternalLinkedHashMap<dynamic, dynamic>' is not a subtype of type 'Map<String, dynamic>'

    class _MyHomePageState extends State<MyHomePage> {
    // 创建Map时, 一定要指定类型, 不然报下面的错误
      Map <String, dynamic>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> 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<String, dynamic>
    */
    

    注意: 发现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<String, dynamic>
    */
    

    相关文章

      网友评论

          本文标题:Flutter 之 json_annotation 和 json

          本文链接:https://www.haomeiwen.com/subject/ueaxgctx.html