2019-05-24 Flutter中借用json_annotation實(shí)現(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字符串的結(jié)構(gòu)和字段構(gòu)造實(shí)體類(model),注意字段類型

一般步驟為:

  • 新建類和屬性(字段)以及帶參構(gòu)造方法,注意屬性類型。
  • 引入json_annotation,即插入import 'package:json_annotation/json_annotation.dart';。
  • 指定此類的生成代碼,part '類名.g.dart';。
  • 添加序列化標(biāo)注,@JsonSerializable(),注意括號(hào)。
  • 添加反序列化和序列化方法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';
//序列化標(biāo)注
@JsonSerializable()
class BaiduSNComputePosition {
  //不加任何JsonKey默認(rèn)允許空json字段
  int status;
  /*SnResult是我自定義的實(shí)體類,這個(gè)類同樣需要執(zhí)行上述的“一般步驟“*/
  SnResult result;

  //構(gòu)造方法
  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.生成對(duì)應(yīng)的.g.dart文件

忽略報(bào)錯(cuò),使用命令flutter packages pub run build_runner build進(jìn)行一次性構(gòu)建,構(gòu)建過(guò)程中flutter會(huì)使用Model類的源文件(包含@JsonSerializable標(biāo)注的)來(lái)生成對(duì)應(yīng)的.g.dart文件。

另外,也可以使用命令flutter packages pub run build_runner watch,這個(gè)命令可以實(shí)現(xiàn)文件監(jiān)聽,自動(dòng)地為你后續(xù)創(chuàng)建的實(shí)體類生成對(duì)應(yīng)的.g.dart文件。
這里給出上述實(shí)體類例子的對(duì)應(yīng).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是實(shí)體類對(duì)象
String jsonStr = json.encode(modelObject);
//反序列化為實(shí)體類,變量jsonString是與實(shí)體類完全匹配的json字符串,BaiduWebPosition是實(shí)體類名
var modelObj= BaiduWebPosition.fromJson(json.decode(jsonString));

以下是我在單元測(cè)試中的例子:

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":"地產(chǎn)小區(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));
  //我的實(shí)體類重寫了toString方法哦
  print("反序列化toString=" + ippAfter.toString());

  var snp = new BaiduSNComputePosition(
      0,
      new SnResult(new SnLocation(117.04521735270665, 39.11214414784875), 1, 80,
          92, "地產(chǎn)小區(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容