簡體   English   中英

你能解釋一下這個 dart json 解析代碼嗎?

[英]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 函數):

  1. 為什么我返回 Class? 示例: return Poligoni(.....various code)
  2. 在這種情況下,重定向構造函數的使用對我來說不是很清楚poligoni:
  3. 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 <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))

我的猜測是vList<dynamic> ,我們希望通過獲取 List v的每個元素並將其插入到已定義為List<String>的新 List 來創建一個List<String>類型的新列表開始。

然后將其結果用作我們新的Map中的值,然后將其用作poligoni參數的值。

簡而言之,所有這些操作都真正用於通過將dynamic類型轉換為靜態確定的類型來使您的代碼更安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM