6.1-Flutter中Json解析和模型轉(zhuǎn)換

Json解析和復(fù)雜模型轉(zhuǎn)換實用技巧

應(yīng)該使用哪種JSON序列化方式

如何序列化

http://www.devio.org/io/flutter_app/json/test_common_model.json

{
  "icon": "http://www.devio.org/io/flutter_app/img/ln_food.png",
  "title": "美食林",
  "url": "https://m.ctrip.com/webapp/you/foods/address.html?new=1&ishideheader=true",
  "statusBarColor": "19A0F0",
  "hideAppBar": true
}
解析:
Map<String,dynamic> map = JSON.decode(jsonStr);
print('icon':${map['icon']})
print('title':${map['title']})

將Map轉(zhuǎn)換成model

class CommonModel {
  final String icon;
  final String title;
  final String url;
  final String statusBarColor;
  final bool hideAppBar;

  CommonModel({this.icon, this.title, this.url, this.statusBarColor,
    this.hideAppBar});

  factory CommonModel.fromJson(Map<String, dynamic> json){
    return CommonModel(
        icon: json['icon'],
        title: json['title'],
        url: json['url'],
        statusBarColor: json['statusBarColor'],
        hideAppBar: json['hideAppBar']);
  }

}

復(fù)雜JSON解析

如何解析對象中的數(shù)組
{
    "url":"xxx",
    "tabs":[
        {
            "labelName":"推薦",
            "groupChannelCode":"tourphoto_global1"
        },
        {
            "labelName":"拍照技巧",
            "groupChannelCode":"tab—photo"
        }
    ]
}

解析:

class TravelTabModel {
  String url;
  List<TravelTab> tabs;

  TravelTabModel({this.url, this.tabs});

  TravelTabModel.fromJson(Map<String, dynamic> json){
    url = json['url'];
    //先將tabs轉(zhuǎn)化成List,再將List中的值轉(zhuǎn)換成TravelTab
    (json['tabs'] as List).map((i) => TravelTab.fromJson(i));
  }

}

/**
 * final寫法
 */
class TravelTabModel2 {
  final String url;
  final List<TravelTab> tabs;

  TravelTabModel2({this.url, this.tabs});

  factory TravelTabModel2.fromJson(Map<String, dynamic> json){
    String url = json['url'];
    List<TravelTab> tabs = (json['tabs'] as List).map((i) =>
        TravelTab.fromJson(i)).toList();
    return TravelTabModel2(url: url, tabs: tabs);
  }
}

class TravelTab {
  String labelName;
  String groupChannelCode;

  TravelTab({this.labelName, this.groupChannelCode});

  TravelTab.fromJson(Map<String, dynamic> json){
    labelName = json['labelName'];
    groupChannelCode = json['groupChannelCode'];
  }
}
轉(zhuǎn)換復(fù)雜大量數(shù)據(jù)

http://www.devio.org/io/flutter_app/json/home_page.json

使用在線轉(zhuǎn)換工具json_to_dart生成實體類

class Autogenerated {
  Config config;
  List<BannerList> bannerList;
  List<LocalNavList> localNavList;
  GridNav gridNav;
  List<SubNavList> subNavList;
  SalesBox salesBox;

  Autogenerated(
      {this.config,
      this.bannerList,
      this.localNavList,
      this.gridNav,
      this.subNavList,
      this.salesBox});

  Autogenerated.fromJson(Map<String, dynamic> json) {
    config =
        json['config'] != null ? new Config.fromJson(json['config']) : null;
    if (json['bannerList'] != null) {
      bannerList = new List<BannerList>();
      json['bannerList'].forEach((v) {
        bannerList.add(new BannerList.fromJson(v));
      });
    }
    if (json['localNavList'] != null) {
      localNavList = new List<LocalNavList>();
      json['localNavList'].forEach((v) {
        localNavList.add(new LocalNavList.fromJson(v));
      });
    }
    gridNav =
        json['gridNav'] != null ? new GridNav.fromJson(json['gridNav']) : null;
    if (json['subNavList'] != null) {
      subNavList = new List<SubNavList>();
      json['subNavList'].forEach((v) {
        subNavList.add(new SubNavList.fromJson(v));
      });
    }
    salesBox = json['salesBox'] != null
        ? new SalesBox.fromJson(json['salesBox'])
        : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.config != null) {
      data['config'] = this.config.toJson();
    }
    if (this.bannerList != null) {
      data['bannerList'] = this.bannerList.map((v) => v.toJson()).toList();
    }
    if (this.localNavList != null) {
      data['localNavList'] = this.localNavList.map((v) => v.toJson()).toList();
    }
    if (this.gridNav != null) {
      data['gridNav'] = this.gridNav.toJson();
    }
    if (this.subNavList != null) {
      data['subNavList'] = this.subNavList.map((v) => v.toJson()).toList();
    }
    if (this.salesBox != null) {
      data['salesBox'] = this.salesBox.toJson();
    }
    return data;
  }
}

class Config {
  String searchUrl;

  Config({this.searchUrl});

  Config.fromJson(Map<String, dynamic> json) {
    searchUrl = json['searchUrl'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['searchUrl'] = this.searchUrl;
    return data;
  }
}

class BannerList {
  String icon;
  String url;

  BannerList({this.icon, this.url});

  BannerList.fromJson(Map<String, dynamic> json) {
    icon = json['icon'];
    url = json['url'];
  }

.....
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末案狠,一起剝皮案震驚了整個濱河市叼耙,隨后出現(xiàn)的幾起案子垂涯,更是在濱河造成了極大的恐慌枉昏,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡普筹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門隘马,熙熙樓的掌柜王于貴愁眉苦臉地迎上來太防,“玉大人,你說我怎么就攤上這事祟霍。” “怎么了盈包?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵沸呐,是天一觀的道長。 經(jīng)常有香客問我呢燥,道長崭添,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任叛氨,我火速辦了婚禮呼渣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寞埠。我一直安慰自己屁置,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布仁连。 她就那樣靜靜地躺著蓝角,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饭冬。 梳的紋絲不亂的頭發(fā)上使鹅,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音昌抠,去河邊找鬼患朱。 笑死,一個胖子當(dāng)著我的面吹牛炊苫,可吹牛的內(nèi)容都是我干的裁厅。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼侨艾,長吁一口氣:“原來是場噩夢啊……” “哼姐直!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蒋畜,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤声畏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體插龄,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡愿棋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了均牢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片糠雨。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖徘跪,靈堂內(nèi)的尸體忽然破棺而出甘邀,到底是詐尸還是另有隱情,我是刑警寧澤垮庐,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布松邪,位于F島的核電站,受9級特大地震影響哨查,放射性物質(zhì)發(fā)生泄漏逗抑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一寒亥、第九天 我趴在偏房一處隱蔽的房頂上張望邮府。 院中可真熱鬧,春花似錦溉奕、人聲如沸褂傀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽紊服。三九已至,卻和暖如春胸竞,著一層夾襖步出監(jiān)牢的瞬間欺嗤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工卫枝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留煎饼,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓校赤,卻偏偏與公主長得像吆玖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子马篮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344