你能解释一下这个 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' 并将其转换为另一个<String>,List<String>
类型的映射
它包含每个键的一个点列表,这些点形成一个多边形,但是我不确定如何,如果您可以编写逐步的步骤,将不胜感激,或者如果您可以重新格式化此代码以使其更清晰,将不胜感激.
我尝试浏览 dart 和 Flutter 文档,但由于我的代码使用的嵌套函数和一点语言障碍,我并没有理解其中的大部分内容。
非常感谢任何帮助, 最好的问候。
【问题讨论】:
【参考方案1】:为什么我返回一个类?例子:return Poligoni(.....各种代码)
因为您使用的是工厂构造函数。工厂构造函数类似于静态方法,但您需要返回与其所属的类兼容的对象实例。
这种模式的一个优点是,在使用普通构造函数时,不允许在构造函数体内设置任何最终变量,但需要将它们设置为初始化阶段的一部分。
在您的情况下,这确实不是问题,因为变量 Map<String, List<String>> 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))
我的猜测是 v
是 List<dynamic>
并且我们希望通过获取 List v
的每个元素并将其插入到已定义为的新 List 中来创建 List<String>
类型的新列表List<String>
从一开始。
然后将其结果用作我们新的Map
中的值,然后将其用作poligoni
参数的值。
简而言之,通过将dynamic
类型转换为静态确定的类型,所有这些操作真正用于使您的代码更安全。
【讨论】:
以上是关于你能解释一下这个 dart json 解析代码吗?的主要内容,如果未能解决你的问题,请参考以下文章