你能解释一下这个 dart json 解析代码吗?

Posted

技术标签:

【中文标题】你能解释一下这个 dart json 解析代码吗?【英文标题】:Can you explain this dart json parsing code please? 【发布时间】:2021-04-22 17:16:27 【问题描述】:

所以我有这个代码以某种方式工作,但我无法真正解释为什么。 为了获得此代码,我使用了一个自动 json 来编码名为 quicktype 的应用程序,使用我公司提供的 json 作为输入。代码的目标是获取包含以下格式的多边形的地图:(多边形的随机 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) 函数的原始 json,要么接受来自 (.fromJson) 函数的解码后的 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: 之后的函数有很多困难:我知道该函数解析json 键'Poligoni' 并将其转换为另一个&lt;String&gt;,List&lt;String&gt; 类型的映射 它包含每个键的一个点列表,这些点形成一个多边形,但是我不确定如何,如果您可以编写逐步的步骤,将不胜感激,或者如果您可以重新格式化此代码以使其更清晰,将不胜感激.

我尝试浏览 dart 和 Flutter 文档,但由于我的代码使用的嵌套函数和一点语言障碍,我并没有理解其中的大部分内容。

非常感谢任何帮助, 最好的问候。


【问题讨论】:

【参考方案1】:

为什么我返回一个类?例子:return Poligoni(.....各种代码)

因为您使用的是工厂构造函数。工厂构造函数类似于静态方法,但您需要返回与其所属的类兼容的对象实例。

这种模式的一个优点是,在使用普通构造函数时,不允许在构造函数体内设置任何最终变量,但需要将它们设置为初始化阶段的一部分。

在您的情况下,这确实不是问题,因为变量 Map&lt;String, List&lt;String&gt;&gt; poligoni 不是 final,但它仍然可以是一个不错的模式。

在此处阅读有关工厂构造函数的更多信息: https://dart.dev/guides/language/language-tour#factory-constructors

在这种情况下,重定向构造函数的使用对我来说不是很清楚 poligoni:

查看我之前的回答。

理解 poligoni 之后的函数有很多困难: : 我知道该函数解析 json 键 'Poligoni' 并将其转换为另一个类型的映射,列表包含每个键的点列表,但这些点形成一个多边形我不知道如何,如果您可以编写一个逐步的演练,将不胜感激,或者如果您可以重新格式化此代码以使其更清晰。

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)));
      ),
    );
  

如前所述,我们定义了一个工厂构造函数,它必须返回一个与其所属的类兼容的对象。在这种情况下,我们因此通过调用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)));
      )

我不太确定我们为什么要使用Map.from,但这个构造函数的目的是根据另一个地图的键值对创建一个新地图: 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&lt;dynamic&gt; 并且我们希望通过获取 List v 的每个元素并将其插入到已定义为的新 List 中来创建 List&lt;String&gt; 类型的新列表List&lt;String&gt; 从一开始。

然后将其结果用作我们新的Map 中的值,然后将其用作poligoni 参数的值。

简而言之,通过将dynamic 类型转换为静态确定的类型,所有这些操作真正用于使您的代码更安全。

【讨论】:

以上是关于你能解释一下这个 dart json 解析代码吗?的主要内容,如果未能解决你的问题,请参考以下文章

你能帮我解析这个 JSON 吗?

你能解释一下为啥 DirectoryInfo.GetFiles 会产生这个 IOException 吗?

你能解释一下这个 Go 指针操作的行为吗?

你能解释一下这段代码的作用吗?

如何编写解析此 JSON 的 Dart 模型类?

Jquery:你能给我解释一下这行代码吗?帮助我理解它,或提供我可以了解它的参考