
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
編譯:碼王爺