[英]Unable to post a http request with json body because jsonEncode method from 'dart:convert' package adding escape character
[英]Dart: Is jsonEncode completely predictable?
我想知道dart:convert
库中的函数jsonEncode()
是否完全可以预测。 也就是说, jsonEncode()
总是以相同的顺序对Map
对象的键和值进行编码?
答案是:视情况而定。
作为一般规则,映射不存储任何顺序,迭代条目可能导致键值对以随机顺序返回。
但是,具体细节更深入一些,并且需要考虑实现细节。 在 Dart 中, Map
是一个抽象类,您可以使用几种不同类型的Map
。
HashMap
是Map
的默认实现。 插入顺序没有保留,实际上,迭代期间返回条目的顺序是相当随机的。 但是,迭代顺序仅在地图本身发生变化时才会发生变化。 这意味着只要您不从地图中添加或删除任何对象,迭代顺序每次都将是相同的顺序。
还有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.