Flutter如何更便捷的json轉model

0x1 前言

做爲剛開始接觸flutter的iOS開發,json轉模型這部分一直是我很是頭疼的地方。如今網上能找到的方案通常有兩種git

0x11 經過解析json建立模型文件

flutter裏把反射直接禁掉了,這直接致使咱們不能動態的給模型賦值。咱們須要建立一個又一個的fromJson方法,而後在這個方法裏取出一個又一個的數據賦值給模型。這是一部分重複且很是無聊代碼。這種方式在使用的工程中也存在一系列的問題:github

  • 不符合咱們正常的開發習慣,通常咱們拿到的都是接口字段定義,與之相對應的json文件咱們是沒有的,構建一個json文件這裏又無故加了一部分工做量。
  • 無法對於數據作一些容錯處理,在作舊業務遷移改造的時候這方面的問題會暴露出來,讓人抓狂。
  • 後續添加刪除字段比較麻煩

工具地址json

0x12 json_serializable

json_serializable用到了dart裏的註解來自動生成代碼。關於註解你能夠類比是編譯插件,在預編譯的時候解析出模型裏定義的字段,而後根據這些字段建立與之相對應的fromJson方法。這種方式和上面的方案某些層面很類似,可是又在必定程度上解決了上面提到的一些問題:api

  • 更加符合咱們的開發習慣,根據接口字段定義屬性。
  • 經過腳本生成代碼,添加刪除字段更加方便。

還存在的問題:bash

  • 仍是無法對數據作容錯處理。
  • 仍是存在一些須要手動添加的重複代碼,以下紅框中的代碼。

0x2 更加便捷的方案

咱們先來梳理一下iOS裏YYModel之類的框架是怎麼作json自動轉model的。首先經過runtime解析出定義的全部屬性名、屬性的類型。而後用這些屬性名去json裏取值賦值給model。那麼咱們若是想要作一套相似的庫的話咱們須要以下能力閉包

0x21 解析出模型裏全部屬性名、屬性類型

flutter把dart裏的反射禁掉了,期望系統的api確定是不現實了。咱們比較容易想到的是咱們能夠手動輸出這部份內容到一個全局的map裏。要用的時候經過className去map裏取。手動作確定不現實,這部分的數據是有規律性的,因此經過腳原本作很是合適。你研究過json_serializable的實現的話你必定知道註解。咱們能夠用註解或者自定義builder來走一個預編譯,在這個階段咱們能解析類,獲取參數名、參數類型。解析出這部分數據以後建立一個文件,而後把這些解析出來的數據根據特定的格式輸出一個全局的map到剛纔建立的文件裏。我這邊不聊具體實現,只聊方案。具體註解相關的使用能夠看註解相關資料框架

0x22 動態建立對象

經過上面的步驟咱們能解析出屬性的類型、屬性名。對於自定義的對象來講,就會存在一個根據類名來建立對應對象的需求。經過閉包來建立對象,用className作key閉包作value,而後把這邊分數據也放到上一步解析出來的map裏。工具

className : () => className()
複製代碼

0x23 動態賦值

動態建立完對象以後咱們須要能給這個對象的屬性來動態賦值。和以前建立對象的處理方式相似,咱們也能夠經過閉包來作,咱們輸出以下格式的內容到上面的map中post

name : (dynamic instance, value) => instance.name = value
複製代碼

0x24 動態取值

在作model to json功能的時候咱們須要可以經過一個String格式的name去對象裏動態獲取這部分的數據。和上面用閉包來處理相似。咱們須要輸出以下格式的內容到以前的map中ui

name : (dynamic instance) => instaned.name
複製代碼

0x25 大體流程圖

0x3 hn_easy_model

我這邊已經實現了一套框架,配置完以後使用起來成本極低,對於客戶端轉過來寫flutter的同窗也更友好。框架地址,歡迎你們試用。

相關文章
相關標籤/搜索