Flutter JSON解析與復(fù)雜模型轉(zhuǎn)換技巧
其實(shí)轉(zhuǎn)換成model類是有好處的鸟款,轉(zhuǎn)換后可以減少上線后APP崩潰和出現(xiàn)異常,所以我們從這節(jié)課開始茂卦,要制作model類模型何什,然后用model的形式編輯UI界面。
類別json的分析
比如現(xiàn)在從后臺(tái)得到了一串JSON數(shù)據(jù):
{"code":"0","message":"success","data": [{"mallCategoryId":"4","mallCategoryName":"白酒","bxMallSubDto": [{"mallSubId":"2c9f6c94621970a801626a35cb4d0175","mallCategoryId":"4","mallSubName":"名酒","comments":""}, {"mallSubId":"2c9f6c94621970a801626a363e5a0176","mallCategoryId":"4","mallSubName":"寶豐","comments":""},{"mallSubId":"2c9f6c94679b4fb10167f7de126815d7","mallCategoryId":"4","mallSubName":"竹葉青","comments":null}],"comments":null,}
模型層的建立
把模型層單獨(dú)放到一個(gè)文件夾里等龙,然后建立一個(gè)category.dart文件处渣。這個(gè)文件就是要結(jié)合json文件,形成的modle文件蛛砰。文件里大量使用了dart中的 factory語法罐栈。
工廠構(gòu)造函數(shù)
factory 關(guān)鍵字的功能,當(dāng)實(shí)現(xiàn)構(gòu)造函數(shù)但是不想每次都創(chuàng)建該類的一個(gè)實(shí)例的時(shí)候使用泥畅。
工廠模式是我們最常用的實(shí)例化對(duì)象模式了荠诬,是用工廠方法代替new操作的一種模式。用簡單明了的方式解釋,模式上類似于面向?qū)ο蟮亩鄳B(tài)柑贞,用起來和靜態(tài)方法差不多方椎。高雅和低俗的結(jié)合,相當(dāng)于聽著貝多芬的交響樂《命運(yùn)》钧嘶,看著波多野結(jié)衣的島國小電影棠众,只要你爽,什么都可以有决。
我們先制作了一個(gè)大分類的Class,代碼如下:
classCategoryBigModel{StringmallCategoryId;//類別IDStringmallCategoryName;//類型名稱List bxMallSubDto;//子類? dynamic動(dòng)態(tài)的Null comments;//描述Stringimage;//圖片//構(gòu)造函數(shù)CategoryBigModel({this.mallCategoryId,this.mallCategoryName,this.bxMallSubDto,this.comments,this.image? });//工廠模式-用這種模式可以省略New關(guān)鍵字factory CategoryBigModel.fromJson(dynamic json){returnCategoryBigModel(? ? ? mallCategoryId: json[‘mallCategoryId‘],mallCategoryName:json[‘mallCategoryName‘],bxMallSubDto:json[‘bxMallSubDto‘],comments:json[‘comments‘],image:json[‘image‘],? ? );? }}
這個(gè)只是單個(gè)的一個(gè)大類信息的模型摄欲,但我們是一個(gè)列表,這時(shí)候就需要制作一個(gè)列表的模型疮薇,而這個(gè)List里邊是我們定義的CategoryBigModel模型胸墙。簡單理解就是先定義一個(gè)單項(xiàng)模型,然后再定義個(gè)列表的模型按咒。
classCategoryBigListModel{List data;? CategoryBigListModel(this.data);? factory CategoryBigListModel.formJson(Listjson){returnCategoryBigListModel(? ? ? json.map((i)=>CategoryBigModel.fromJson((i))).toList()? ? );? }? }
這樣就建立好了一個(gè)模型迟隅,其實(shí)這個(gè)模型還可以繼續(xù)建立,以后的課程中也會(huì)逐漸深入励七。這里到這里智袭,相信大家都掌握了建立模型的方法。
數(shù)據(jù)模型的使用
使用數(shù)據(jù)模型就簡單很多了掠抬。直接聲明變量吼野,調(diào)用formJson方法就可以了。直接在_getCategory()方法里两波。記得先引入數(shù)據(jù)模型類瞳步,然后用.的形式進(jìn)行輸出了。
import‘../model/category.dart‘;void_getCategory()async{awaitrequest(‘post‘, ‘getCategory‘).then((val){vardata = json.decode(val.toString());//print(data);CategoryBigListModel list = CategoryBigListModel.formJson(data[‘data‘]);? ? ? list.data.forEach((item) =>print(item.mallCategoryName));? ? });}
寫完這些腰奋,你就可以在控制臺(tái)看到結(jié)果了单起。如果是第一次接觸數(shù)據(jù)模型,可能還是稍微有些繞的劣坊。
json_to_dart的使用
如果我們得到一個(gè)特別復(fù)雜的JSON,有時(shí)候會(huì)無從下手開始寫Model,這時(shí)候就可以使用一些輔助工具嘀倒。我認(rèn)為json_to_dart是比較好用的一個(gè)。它可以直接把json轉(zhuǎn)換成dart類局冰,然后進(jìn)行一定的修改测蘑,就可以快樂的使用了。工作中我拿到一個(gè)json康二,都是先操作一下碳胳,然后再改的。算是一個(gè)小竅門吧赠摇。