flutter json_annotation和json_serializable處理json資料序列化
-
導包
dependencies:
json_annotation: ^2.4.0
dev_dependencies:
fluttertoast: ^2.0.3
json_serializable: ^3.0.0
build_runner: ^1.6.0
-
建立Author實體類(舉例子,新建檔案author.dart)
-
author.dart
import 'package:json_annotation/json_annotation.dart'; part 'author.g.dart'; @JsonSerializable() //註解 class Author { String name; String title; int id; Author({this.name, this.title, this.id}); factory Author.fromJson(Map<String, dynamic> json) => _$AuthorFromJson(json); Map<String, dynamic> toJson(Author instance) => _$AuthorToJson(instance); }
效果圖:
這裡有幾點需要注意的
1、當我們初次建立Author.dart的時候,需要加入 part 'Author.g.dart'; 雖然系統會提示報錯,但是不必緊張,這個我們一會生成Author.g.dart檔案所必須的條件,我們暫時不要管它報不報錯
2、在需要轉換的實體dart類前 加入@JsonSerializable()註解,表示需要json序列話處理
3、fromJson() 方法和 toJson()方法的寫法是固定模式的,大家按模板修改就行
接下來我們就該見證奇蹟的發生了
我們cd到專案的根目錄,然後使用 flutter packages pub run build_runner build 這條指令去生成Author.g.dart檔案
修改圖如下:
然後我們就會在Author.dart的下面發現一個Author.g.dart檔案,到此結束,我們開始驗證是否有效
-
編寫測試類
import 'package:flutter/material.dart'; import '../model/author.dart'; class NoticePage extends StatefulWidget{ @override _NoticePageState createState() => _NoticePageState(); } class _NoticePageState extends State<NoticePage>{ void _getData() async { var obj = {"name":"whisky", "title":'阿發生的發生阿斯蒂芬暗示法按時', "id":2020}; var c = Author.fromJson(obj); print("作者的名字是:"+c.name); print("作者的名字是:"+c.title); print('${c.id}'); print('${c.id.runtimeType}'); print(c); } @override void initState(){ super.initState(); _getData(); } @override Widget build(BuildContext context){ final _main = Container( width: MediaQuery.of(context).size.width, padding: EdgeInsets.all(30), child: Column( children: [ Text('notice') ], ), ); return Scaffold( appBar: AppBar( centerTitle: true, title: Text('我的訊息',style: TextStyle(color: Colors.white)), ), body: _main, ); } }
列印結果:
測試完成,謝謝大家!!!