【问题标题】:Can you explain this dart json parsing code please?你能解释一下这个 dart json 解析代码吗?
【发布时间】: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 函数):

  1. 为什么我返回一个类?例如:return Poligoni(.....various code)
  2. 在这种情况下重定向构造函数的使用对我来说不是很清楚poligoni:
  3. 理解poligoni: 之后的函数有很多困难:我知道该函数解析json 键'Poligoni' 并将其转换为另一个&lt;String&gt;,List&lt;String&gt; 类型的映射 它包含每个键的一个点列表,这些点形成一个多边形,但是我不确定如何,如果您可以编写逐步的步骤,将不胜感激,或者如果您可以重新格式化此代码以使其更清晰,将不胜感激.

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

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


【问题讨论】:

    标签: android json android-studio flutter dart


    【解决方案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 类型转换为静态确定的类型,所有这些操作真正用于使您的代码更安全。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多