2019-05-24 Flutter中借用json_annotation實現(xiàn)序列化和反序列化

1.引入json_annotation依賴

pubspec.yaml

dependencies:
  # Your other regular dependencies here
  json_annotation: ^2.0.0

dev_dependencies:
  # Your other dev_dependencies here
  build_runner: ^1.0.0
  json_serializable: ^2.0.0

2.根據(jù)json字符串的結構和字段構造實體類(model),注意字段類型

一般步驟為:

  • 新建類和屬性(字段)以及帶參構造方法,注意屬性類型峰档。
  • 引入json_annotation紊撕,即插入import 'package:json_annotation/json_annotation.dart';谤专。
  • 指定此類的生成代碼告组,part '類名.g.dart';箩溃。
  • 添加序列化標注怠噪,@JsonSerializable()恐似,注意括號。
  • 添加反序列化和序列化方法fromJsontoJson傍念,即factory 類名.fromJson(Map<String, dynamic> json) =>_$類名FromJson(json);Map<String, dynamic> toJson() => _$類名ToJson(this);矫夷。

例:BaiduSNComputePosition.dart

//引入json_annotation
import 'package:json_annotation/json_annotation.dart';
import 'package:flutter_app/model/SnResult.dart';
//此類的生成代碼,part '類名.g.dart';
part 'BaiduSNComputePosition.g.dart';
//序列化標注
@JsonSerializable()
class BaiduSNComputePosition {
  //不加任何JsonKey默認允許空json字段
  int status;
  /*SnResult是我自定義的實體類憋槐,這個類同樣需要執(zhí)行上述的“一般步驟“*/
  SnResult result;

  //構造方法
  BaiduSNComputePosition(this.status, this.result);

  //反序列化,factory *.fromJson(Map<String, dynamic> json) =>_$*FromJson(json);
  factory BaiduSNComputePosition.fromJson(Map<String, dynamic> json) =>
      _$BaiduSNComputePositionFromJson(json);

  //序列化,Map<String, dynamic> toJson() => _$*ToJson(this);
  Map<String, dynamic> toJson() => _$BaiduSNComputePositionToJson(this);

  @override
  String toString() {
    return '{status: $status, result: $result}';
  }
}

3.生成對應的.g.dart文件

忽略報錯双藕,使用命令flutter packages pub run build_runner build進行一次性構建,構建過程中flutter會使用Model類的源文件(包含@JsonSerializable標注的)來生成對應的.g.dart文件阳仔。

另外忧陪,也可以使用命令flutter packages pub run build_runner watch,這個命令可以實現(xiàn)文件監(jiān)聽,自動地為你后續(xù)創(chuàng)建的實體類生成對應的.g.dart文件赤嚼。
這里給出上述實體類例子的對應.g.dart文件:BaiduSNComputePosition.g.dart

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'BaiduSNComputePosition.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

BaiduSNComputePosition _$BaiduSNComputePositionFromJson(
    Map<String, dynamic> json) {
  return BaiduSNComputePosition(
      json['status'] as int,
      json['result'] == null
          ? null
          : SnResult.fromJson(json['result'] as Map<String, dynamic>));
}

Map<String, dynamic> _$BaiduSNComputePositionToJson(
        BaiduSNComputePosition instance) =>
    <String, dynamic>{'status': instance.status, 'result': instance.result};

4.使用

使用json.encodejson.decode旷赖,需要引入import 'dart:convert';

//序列化為json字符串更卒,變量modelObject是實體類對象
String jsonStr = json.encode(modelObject);
//反序列化為實體類等孵,變量jsonString是與實體類完全匹配的json字符串,BaiduWebPosition是實體類名
var modelObj= BaiduWebPosition.fromJson(json.decode(jsonString));

以下是我在單元測試中的例子:

import 'dart:convert';
import 'package:flutter_app/model/Address_detail.dart';
import 'package:flutter_app/model/BWPContent.dart';
import 'package:flutter_app/model/BaiduSNComputePosition.dart';
import 'package:flutter_app/model/BaiduWebPosition.dart';
import 'package:flutter_app/model/Bdpoint.dart';
import 'package:flutter_app/model/SnLocation.dart';
import 'package:flutter_app/model/SnResult.dart';

void main() {

  String ipjsonString =
      '{"address":"CN|\u5929\u6d25|\u5929\u6d25|None|UNICOM|0|0","content":{"address":"\u5929\u6d25\u5e02","address_detail":{"city":"\u5929\u6d25\u5e02","city_code":332,"district":"","province":"\u5929\u6d25\u5e02","street":"","street_number":""},"point":{"x":"117.21081309","y":"39.14392990"}},"status":0}';
  String snjsonString =
      '{"status":0,"result":{"location":{"lng":117.04521735270664,"lat":39.11214414784875},"precise":1,"confidence":80,"comprehension":92,"level":"地產小區(qū)"}}';
  var address = 'CN|\u5929\u6d25|\u5929\u6d25|None|UNICOM|0|0';
  var addr = '\u5929\u6d25\u5e02';
  var ipp = new BaiduWebPosition(
      address,
      new BWPContent(
          addr,
          new Address_detail(
              "\u5929\u6d25\u5e02", 332, "", "\u5929\u6d25\u5e02", "", ""),
          new Bdpoint("117.21081309", "39.14392990")),
      0);
  String ipjsonStr = json.encode(ipp);
  print("new ip-json=" + ipjsonStr);
  var ippAfter = BaiduWebPosition.fromJson(json.decode(ipjsonString));
  //我的實體類重寫了toString方法哦
  print("反序列化toString=" + ippAfter.toString());

  var snp = new BaiduSNComputePosition(
      0,
      new SnResult(new SnLocation(117.04521735270665, 39.11214414784875), 1, 80,
          92, "地產小區(qū)"));
  String snjsonStr = json.encode(snp);
  print("new sn-json=" + snjsonStr);
  var snpAfter2 = BaiduSNComputePosition.fromJson(json.decode(snjsonString));
  print("反序列化toString=" + snpAfter2.toString());
}


參考資料:
flutter demo (三):json處理
Json Model

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末蹂空,一起剝皮案震驚了整個濱河市俯萌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌上枕,老刑警劉巖咐熙,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辨萍,居然都是意外死亡棋恼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門锈玉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來爪飘,“玉大人,你說我怎么就攤上這事拉背∈ζ椋” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵椅棺,是天一觀的道長犁罩。 經常有香客問我,道長两疚,這世上最難降的妖魔是什么床估? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮鬼雀,結果婚禮上顷窒,老公的妹妹穿的比我還像新娘。我一直安慰自己源哩,他們只是感情好鞋吉,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著励烦,像睡著了一般谓着。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坛掠,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天赊锚,我揣著相機與錄音治筒,去河邊找鬼。 笑死舷蒲,一個胖子當著我的面吹牛耸袜,可吹牛的內容都是我干的。 我是一名探鬼主播牲平,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼堤框,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纵柿?” 一聲冷哼從身側響起蜈抓,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昂儒,沒想到半個月后沟使,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡渊跋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年腊嗡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刹枉。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡叽唱,死狀恐怖,靈堂內的尸體忽然破棺而出微宝,到底是詐尸還是另有隱情,我是刑警寧澤虎眨,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布蟋软,位于F島的核電站,受9級特大地震影響嗽桩,放射性物質發(fā)生泄漏岳守。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一碌冶、第九天 我趴在偏房一處隱蔽的房頂上張望湿痢。 院中可真熱鬧,春花似錦扑庞、人聲如沸譬重。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臀规。三九已至,卻和暖如春栅隐,著一層夾襖步出監(jiān)牢的瞬間塔嬉,已是汗流浹背玩徊。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谨究,地道東北人恩袱。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像胶哲,于是被迫代替她去往敵國和親憎蛤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內容

  • 前言 Google推出flutter這樣一個新的高性能跨平臺(Android纪吮,ios)快速開發(fā)框架之后俩檬,被業(yè)界許多...
    Vadaski閱讀 31,962評論 15 41
  • 在 Flutter 中使用JSON 現(xiàn)在網(wǎng)上已經有很多教程了。此篇文章用于記錄和學習使用參考 Flutter中文網(wǎng)...
    zda123000閱讀 4,406評論 0 9
  • 1碾盟、使用model和不使用model import'dart:convert'; import'dart:io';...
    FrankyJ閱讀 642評論 0 0
  • 很難想象一個移動應用程序不需要與Web服務器通信或在某些時候容易存儲結構化數(shù)據(jù)棚辽。制作網(wǎng)絡連接的應用程序時,遲早需要...
    共田君閱讀 13,446評論 1 5
  • 早該知曉 這世上不存在什么天長地久的愛情 一個人陪你一段路就該知足 蜜語裹挾著謊言 像氣球一樣膨脹炸開 一個個在你...
    驚喜閱讀 149評論 0 0