[英]Can you explain this dart json parsing code please?
所以我有這個代碼以某種方式工作,但我無法解釋為什么。 為了得到這個代碼,我使用了一個自動 json 來編碼名為quicktype的應用程序,使用我公司提供的 json 作為輸入。 代碼的目標是獲取包含以下格式的多邊形的 Map:{(多邊形的隨機 ID)} ==> [Lat,Lon]
class Poligoni {
Map<String, List<String>> poligoni;
Poligoni({
this.poligoni,
});
factory Poligoni.fromRawJson(String str) {
return Poligoni.fromJson(json.decode(str));
}
factory Poligoni.fromJson(Map<String, dynamic> json) {
return Poligoni(
poligoni: Map.from(json["Poligoni"]).map((k, v) {
return MapEntry<String, List<String>>(
k, List<String>.from(v.map((x) => x)));
}),
);
}
}
因此,代碼要么接受來自 (.fromRawJson) function 的原始 json,要么接受來自 (.fromJson) function 的解碼后的 json。 這里沒有問題。 讓我困惑的部分是這個:
factory Poligoni.fromJson(Map<String, dynamic> json) {
return Poligoni(
poligoni: Map.from(json["Poligoni"]).map((k, v) {
return MapEntry<String, List<String>>(
k, List<String>.from(v.map((x) => x)));
}),
);
}
我理解的問題是(.fromJson 函數):
return Poligoni(.....various code)
poligoni:
poligoni:
: i know that the function parses the json key 'Poligoni' and transform this in another map of type <String>,List<String>
that contains for every key a list of points which form一個多邊形,但是我不確定如何,如果您可以逐步編寫它,將不勝感激,或者如果您可以重新格式化此代碼以使其更清晰,則將不勝感激。我嘗試瀏覽 dart 和 flutter 文檔,但由於我的代碼使用的嵌套函數和一點語言障礙,我沒有理解其中的大部分內容。
非常感謝任何幫助,最好的問候。
為什么我返回 Class? 示例:return Poligoni(.....各種代碼)
因為您使用的是工廠構造函數。 工廠構造函數類似於 static 方法,但您需要返回與其所屬的 class 兼容的 object 實例。
這種模式的一個優點是,在使用普通構造函數時,不允許在構造函數主體內設置任何最終變量,但需要將它們設置為初始化階段的一部分。
在你的情況下,這真的不是問題,因為變量Map<String, List<String>> poligoni
不是final
的,但它仍然是一個很好的模式。
在此處閱讀有關工廠構造函數的更多信息: https://dart.dev/guides/language/language-tour#factory-constructors
在這種情況下,重定向構造函數的使用對我來說不是很清楚 poligoni:
看我之前的回答。
A lot of difficulty undestanding the function after poligoni: : i know that the function parses the json key 'Poligoni' and transform this in another map of type,List that contains for every key a list of points which form a polygon however i am not確定如何,如果您可以編寫逐步的演練,將不勝感激,或者如果您可以重新格式化此代碼以使其更清晰,那么您將不勝感激。
factory Poligoni.fromJson(Map<String, dynamic> json) {
return Poligoni(
poligoni: Map.from(json["Poligoni"]).map((k, v) {
return MapEntry<String, List<String>>(
k, List<String>.from(v.map((x) => x)));
}),
);
}
如前所述,我們定義了一個工廠構造函數,它必須返回一個 object,它與它所屬的 class 兼容。 因此,在這種情況下,我們通過調用 Poligoni 的構造函數來創建一個新的Poligoni
Poligoni
,該構造函數采用命名參數poligoni
。 這就是為什么我們有poligoni:
。
我們將命名參數poligoni
設置為以下語句的值:
Map.from(json["Poligoni"]).map((k, v) {
return MapEntry<String, List<String>>(
k, List<String>.from(v.map((x) => x)));
})
I am not really sure why we are using Map.from
but the purpose of this constructor is to create a new map based on the key-values from another map: https://api.dart.dev/stable/2.10.4/ dart-core/Map/Map.from.html
(就個人而言,我會使用來自json["Poligoni"]
的類型轉換,因為這必須是Map
實例)
然后我們在這個新的Map
上調用.map
來創建另一個新的Map
,但是每個鍵值對通過以下方法映射到新的鍵值對:
(k, v) {
return MapEntry<String, List<String>>(
k, List<String>.from(v.map((x) => x)));
}
我們可以在這里看到,我們保留了原始鍵k
,但將值v
轉換為:
List<String>.from(v.map((x) => x))
我的猜測是v
是List<dynamic>
,我們希望通過獲取 List v
的每個元素並將其插入到已定義為List<String>
的新 List 來創建一個List<String>
類型的新列表開始。
然后將其結果用作我們新的Map
中的值,然后將其用作poligoni
參數的值。
簡而言之,所有這些操作都真正用於通過將dynamic
類型轉換為靜態確定的類型來使您的代碼更安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.