Flutter-JSON讀取和解析

在開發(fā)中,我們經(jīng)常會(huì)使用本地JSON或者從服務(wù)器請(qǐng)求數(shù)據(jù)后回去到JSON西雀,拿到JSON后通常會(huì)將JSON轉(zhuǎn)成Model對(duì)象來進(jìn)行后續(xù)的操作,因?yàn)檫@樣操作更加的方便,也更加的安全渡贾。

所以學(xué)習(xí)JSON的相關(guān)操作以及讀取JSON后如何轉(zhuǎn)成Model對(duì)象對(duì)于Flutter開發(fā)也非常重要碍扔。

1. JSON資源配置

JSON也屬于一種資源狠轻,所以在使用之前需要先進(jìn)行相關(guān)的配置


image.png

JSON文件內(nèi)容:

[{
        "nickName": "李明",
        "roomName": "8801",
        "roomSrc": "https://tva1.sinaimg.cn/large/006y8mN6gy1g7aa03bmfpj3069069mx8.jpg"
    },
    {
        "nickName": "王小",
        "roomName": "8802",
        "roomSrc": "https://tva1.sinaimg.cn/large/006y8mN6gy1g7aa03bmfpj3069069mx8.jpg"
    },
    {
        "nickName": "張三",
        "roomName": "8803",
        "roomSrc": "https://tva1.sinaimg.cn/large/006y8mN6gy1g7aa03bmfpj3069069mx8.jpg"
    }
]

2. JSON讀取解析

2.1 JSON資源讀取

如果我們希望讀取JSON資源服猪,可以使用package:flutter/services.dart包中的rootBundle。
在rootBundle中有一個(gè)loadString方法渣磷,可以去加載JSON資源

  • 但是注意婿着,查看該方法的源碼,你會(huì)發(fā)現(xiàn)這個(gè)操作是一個(gè)異步的

2.2 JSON字符串轉(zhuǎn)化

拿到JSON字符串后醋界,我們需要將其轉(zhuǎn)成成我們熟悉的List和Map類型竟宋。
我們可以通過dart:convert包中的json.decode方法將其進(jìn)行轉(zhuǎn)化

Future<List<Anchor>> getAnchors() async {
    //1. 讀取json文件
    String jsonString = await rootBundle.loadString("assets/test.json");

    //2.轉(zhuǎn)成List或Map類型
    final jsonResult = json.decode(jsonString);

    //遍歷List,并且轉(zhuǎn)成Anchor對(duì)象放到另一個(gè)List中
    List<Anchor> anchors = new List();
    for(Map<String,dynamic> map in jsonResult) {
      anchors.add(Anchor.withMap(map));
    }

    return anchors;
  }

2.3 對(duì)象Model定義

將JSON轉(zhuǎn)成了List和Map類型后物独,就可以將List中的一個(gè)個(gè)Map轉(zhuǎn)成Model對(duì)象袜硫,所以我們需要定義自己的Model

import 'package:flutter/services.dart' show rootBundle;
import 'dart:convert';
import 'dart:async';

class Anchor {
  String nickName;
  String roomName;
  String imageUrl;

  Anchor({
    this.nickName,
    this.roomName,
    this.imageUrl
});

  Anchor.withMap(Map<String,dynamic> parseMap) {
    this.nickName = parseMap["nickName"];
    this.roomName = parseMap["roomName"];
    this.imageUrl = parseMap["roomSrc"];
  }

  Future<List<Anchor>> getAnchors() async {
    //1. 讀取json文件
    String jsonString = await rootBundle.loadString("assets/test.json");

    //2.轉(zhuǎn)成List或Map類型
    final jsonResult = json.decode(jsonString);

    //遍歷List氯葬,并且轉(zhuǎn)成Anchor對(duì)象放到另一個(gè)List中
    List<Anchor> anchors = new List();
    for(Map<String,dynamic> map in jsonResult) {
      anchors.add(Anchor.withMap(map));
    }

    return anchors;
  }

  @override
  String toString() {
    return "$nickName - $roomName : $imageUrl";
  }
}

3. JSON解析代碼

這里我單獨(dú)創(chuàng)建了一個(gè)anchor.dart的文件挡篓,在其中定義了所有的相關(guān)代碼:

  • 之后外界只需要調(diào)用我內(nèi)部的getAnchors就可以獲取到解析后的數(shù)據(jù)了
import 'package:flutter/material.dart';
import 'anchor.dart';

main(List<String> args) {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text("HelloWorld"),
        ),
        body: MyHomeBody(),
      ),
    );
  }
}

class MyHomeBody extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var future = Anchor().getAnchors();
    future.then((value) {
      print(value.toString());
    }).catchError((error) {
      // 捕獲出現(xiàn)異常時(shí)的情況
      print(error);
    });
    return Center(child: Text("json文件讀取"));
  }
}
image.png

學(xué)習(xí)內(nèi)容來自Flutter從入門到實(shí)戰(zhàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市帚称,隨后出現(xiàn)的幾起案子官研,更是在濱河造成了極大的恐慌,老刑警劉巖闯睹,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件戏羽,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡楼吃,警方通過查閱死者的電腦和手機(jī)始花,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孩锡,“玉大人酷宵,你說我怎么就攤上這事」埽” “怎么了浇垦?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)荣挨。 經(jīng)常有香客問我男韧,道長(zhǎng),這世上最難降的妖魔是什么默垄? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任此虑,我火速辦了婚禮,結(jié)果婚禮上口锭,老公的妹妹穿的比我還像新娘寡壮。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布况既。 她就那樣靜靜地躺著这溅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棒仍。 梳的紋絲不亂的頭發(fā)上悲靴,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音莫其,去河邊找鬼癞尚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乱陡,可吹牛的內(nèi)容都是我干的浇揩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼憨颠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼胳徽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起爽彤,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤养盗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后适篙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體往核,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年嚷节,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了聂儒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硫痰,死狀恐怖衩婚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碍论,我是刑警寧澤谅猾,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站鳍悠,受9級(jí)特大地震影響税娜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜藏研,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一敬矩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蠢挡,春花似錦弧岳、人聲如沸凳忙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涧卵。三九已至,卻和暖如春腹尖,著一層夾襖步出監(jiān)牢的瞬間柳恐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工热幔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乐设,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓绎巨,卻偏偏與公主長(zhǎng)得像近尚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子场勤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容