Swift无法在JSON生成的字符串中保持顺序以进行哈希验证



我们从网络接收到一个JSON对象以及该对象的哈希值。为了验证哈希值,我们需要将JSON转换为字符串,然后对其进行哈希,同时保留元素在JSON中的顺序。假设我们有:

[
{"site1": 
{"url":"https://this.is.site.com/",
"logoutURL":"",
"loadStart":[],
"loadStop":[{"someMore":"smthelse"}],
"there's_more": ... }
},
{"site2":
....
}
]

Android应用程序能够获得相同的哈希值,在调试时,我们将相同的简单字符串输入两种算法,并能够从中获得相同的哈希值。不同之处在于字典是无序结构。在调试时,我们看到在将字符串输入散列算法之前,字符串看起来像原始JSON,只是没有缩进,这意味着它保留了其中项的顺序(在Android上是这样):

[{"site1":{"url":"https://this.is.site.com/", ...

虽然使用许多方法执行此操作,但现在我无法实现相同的:我得到的字符串顺序不同,因此产生不同的哈希值。有办法做到这一点吗?

似乎问题略有不同-感谢@Rob Napier下面的回答:我只需要传入字符串(其中有JSON)的一部分的哈希值,这意味着获得该部分我需要首先将其解析为JSON或结构体,之后-同时获得它的字符串值-项目的顺序丢失。

使用JSONSerialization和JSONDecoder(使用JSONSerialization),不可能重现输入数据。但这是不必要的。你首先接收的是一个字符串(作为NSData)。只是不要丢掉它。你可以把数据解析成JSON而不扔掉数据。

可以在Swift中从头开始创建JSON解析器来维护往返支持(我在RNJSON中有一个这样的草图)。JSON其实并不难解析。但你所描述的是"你收到的东西"的散列。不是"重新序列化的JSON"的哈希值。

最新更新