繁体   English   中英

Dart:jsonEncode 是完全可预测的吗?

[英]Dart: Is jsonEncode completely predictable?

我想知道dart:convert库中的函数jsonEncode()是否完全可以预测。 也就是说, jsonEncode()总是以相同的顺序对Map对象的键和值进行编码?

答案是:视情况而定。

作为一般规则,映射不存储任何顺序,迭代条目可能导致键值对以随机顺序返回。

但是,具体细节更深入一些,并且需要考虑实现细节。 在 Dart 中, Map是一个抽象类,您可以使用几种不同类型的Map

HashMapMap的默认实现。 插入顺序没有保留,实际上,迭代期间返回条目的顺序是相当随机的。 但是,迭代顺序仅在地图本身发生变化时才会发生变化。 这意味着只要您不从地图中添加或删除任何对象,迭代顺序每次都将是相同的顺序。

还有LinkedHashMap类。 HashMap不同,这种类型的映射确实保留了插入顺序。 当您遍历条目时,它们将按照它们添加到地图中的相同顺序出现。 因此,当假定特定顺序时,迭代LinkedHashMap是安全的。 (顺便说一句,这是使用地图文字时创建的地图类型,即{ 'a': 1 } 。)

另一个例子是SplayTreeMap 与其他两个不同,此映射根据键的compareTo方法维护特定顺序。 也可以通过在创建地图时传入比较方法来覆盖此行为。


这一切都是假设我们从Map的角度讨论迭代顺序。 但是,从jsonEncode的角度来看它可能是另一jsonEncode Dart 会尽可能委托特定于原生平台的 JSON 编码器,并且该编码器可以读取与其实现建议不同的映射。 也没有真正的方法来预测转换库将如何返回从 JSON 解析的映射。 这不会以任何方式影响 JSON - 几乎每个 JSON 编码器和解析器都会以相同的方式处理 JSON,无论键的顺序如何。

简而言之,假设Map的条目将保持可预测甚至一致的顺序通常是不明智的。 如果您需要固定顺序,另一种数据结构可能会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM