Flutter 之 json_annotation 和 json

2019-12-02  本文已影响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 # 用于自动生成代码

编写创建对象代码

自动生成代码文件

使用

注意:创建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>
*/
上一篇下一篇

猜你喜欢

热点阅读