新手教程:如何在 Flutter 中解析 Json?

Dart 內(nèi)置了對 Json 解析的支持,可以使用 dart:convert 將給定的 Json String(其 Json 格式合法)轉(zhuǎn)換為帶字符串 Key 和動態(tài)對象 Value 的 Map。你可以直接將 Json 解析為 Map 使用,也可以將其解析后存放到類型化對象中,使得數(shù)據(jù)更為結(jié)構(gòu)化且更易于維護(hù)。

直接解析和使用

var jsonData = '{ "name" : "Dane", "alias" : "FilledStacks"  }';
var parsedJson = json.decode(jsonData);
print('${parsedJson.runtimeType} : $parsedJson');

運(yùn)行以上代碼將輸出:

_InternalLinkedHashMap<String, dynamic> : {name: Dane, alias: FilledStacks}

因此,訪問解析數(shù)據(jù)的方式是使用 Key 來查詢 Map。具體的做法如下:

...
var name = parsedJson['name'];
var alias = parsedJson['alias'];
print('$name is $alias');

這段代碼將輸出:

Dane is FilledStacks

解析至對象

更為通用的做法是將這些數(shù)據(jù)解析到一個專為其建模的類中,而不是直接使用解析后的 Map。這通常是通過 Dart 中的命名構(gòu)造函數(shù)來達(dá)成。讓我們來將測試數(shù)據(jù)放入模型 (Model) 中——首先我們將以基本方式定義模型,然后定義命名構(gòu)造函數(shù):

class User {
  String name;
  String alias;

  User(Map<String, dynamic> data) {
    name = data['name'];
    alias = data['alias'];
  }
}

...

var jsonData = '{ "name" : "Dane", "alias" : "FilledStacks"  }';
var parsedJson = json.decode(jsonData);
var user = User(parsedJson);
print('${user.name} is ${user.alias}');

這與訪問原始 Map 功能相同,但更易于閱讀、理解和維護(hù)。除了構(gòu)造函數(shù)之外也不用字符串 Key。這種方式不錯,但是只有一個構(gòu)造函數(shù)是種限制,它使 Model 類不是對擴(kuò)展開放,而是必須進(jìn)行修改,才能將其它功能添加進(jìn)去。更通用的做法是定義一個可以設(shè)置所有屬性的構(gòu)造函數(shù),并使用命名構(gòu)造函數(shù)顯式地使用外部數(shù)據(jù)來創(chuàng)建 Model:

class User {
  final String name;
  final String alias;

  User({this.name, this.alias});

  User.fromJson(Map<String, dynamic> data)
      : name = data['name'],
        alias = data['alias'];
}

...

var jsonData = '{ "name" : "Dane", "alias" : "FilledStacks"  }';
var parsedJson = json.decode(jsonData);
var user = User.fromJson(parsedJson);
print('${user.name} is ${user.alias}');

這更清晰、更明確,并且模型 (Model) 現(xiàn)在更少地依賴傳遞給它的 Map。但有個問題需要考慮:更復(fù)雜的 Json 需要復(fù)雜的 Model,你真的想為一個簡單的 Model 鍵入所有這些字段嗎?我會這樣做,因?yàn)槲艺J(rèn)為從長遠(yuǎn)來看是值得的。幸運(yùn)的是其實(shí)不必手動編寫,有現(xiàn)成的在線工具可以處理:JSON to Dart

把你的 Json 粘貼在左邊文本框,右邊就會生成對應(yīng)的 Model。類名總是叫 AutoGenerated,你可以重命名為想要的名稱,還可以選擇使用私有字段。工具可以生成你要的任何 Json 對象的創(chuàng)建代碼。

如果有一天這個網(wǎng)站出于某些原因關(guān)閉了。只需要搜索 Json to Dart converter,你就會找到不少類似的工具甚至是 git 倉庫。


原文: https://www.filledstacks.com/snippet/how-to-parse-json-in-flutter/
作者:Dane Mackier
編譯:碼王爺

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

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

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