Ios 将NSDictionary转换为Json字符串会导致元素重新排序
我正在尝试使用以下方法将NSDictionary对象转换为json字符串:Ios 将NSDictionary转换为Json字符串会导致元素重新排序,ios,json,swift,dictionary,Ios,Json,Swift,Dictionary,我正在尝试使用以下方法将NSDictionary对象转换为json字符串: let data = try JSONSerialization.data(withJSONObject: data, options :[]) var string = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue)) 无论它如何按字母顺序对各个元素重新排序,Swift返回的结果如下: {"cl
let data = try JSONSerialization.data(withJSONObject: data, options :[])
var string = String(data: data, encoding: String.Encoding(rawValue: String.Encoding.utf8.rawValue))
无论它如何按字母顺序对各个元素重新排序,Swift返回的结果如下:
{"client-nonce":"4q7581q6CbkAlJAAajHuWFiLJTPKJLpk","timestamp":"1480560235","token":"5aeba5cb66644e8e739765632a23f2f98a4035f99306f46777c67cea652dad79","url":"http://api.uselinkthrow.local/api/me/stream/friend/links"}
我想保留词典的制作顺序,因此返回以下内容:
{"token":"5aeba5cb66644e8e739765632a23f2f98a4035f99306f46777c67cea652dad79","timestamp":"1480560235","client-nonce":"4q7581q6CbkAlJAAajHuWFiLJTPKJLpk","url":"http://api.uselinkthrow.local/api/me/stream/friend/links"}
有人知道我如何做到这一点吗?您不能也不应该依赖JSON对象中元素的顺序 JSON对象是一个键值对,没有顺序,你不能对它排序,最后的顺序也不重要
有关更多详细信息,请检查您不能也不应该依赖JSON对象中元素的顺序 JSON对象是一个键值对,没有顺序,你不能对它排序,最后的顺序也不重要
要了解更多详细信息,请检查仅使用字典和简单(单级)JSON无法做到这一点 字典在JSON和Swift(以及任何其他语言)中都是按自然顺序排列的。如果需要维护订单,则应使用数组 很难对您的问题给出一个具体的答案,因为您没有提供任何想要保持这种顺序的原因,也没有提供关于如何生成数据的性质的详细信息(例如,字典是否总是具有相同的键,它们是否应该始终处于相同的顺序?) 但是,如果确实需要维护顺序,并且您可以使用不同的JSON格式,则可以根据您的需求,通过以下两种方法之一来实现:
这可能有点含糊不清,但为了得到更好的答案,您可能需要提供更多关于您的实际需求的信息。仅使用字典和简单(单级)JSON无法做到这一点 字典在JSON和Swift(以及任何其他语言)中都是按自然顺序排列的。如果需要维护订单,则应使用数组 很难对您的问题给出一个具体的答案,因为您没有提供任何想要保持这种顺序的原因,也没有提供关于如何生成数据的性质的详细信息(例如,字典是否总是具有相同的键,它们是否应该始终处于相同的顺序?) 但是,如果确实需要维护顺序,并且您可以使用不同的JSON格式,则可以根据您的需求,通过以下两种方法之一来实现:
这可能有点含糊不清,但为了得到更好的答案,您可能需要提供更多关于您的实际需求的信息。正如其他人所提到的,这是一本字典,它不是为提供有序密钥而设计的。它被设计成具有快速散列查找功能,因此只需继续使用它就可以将事情按正确的顺序排列 我不确定为什么您需要某种有序字符串,因此这只是一个示例,供您按照所需顺序打印字符串:
if let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String : Any] {
["token", "timestamp", "client-nonce", "url"].forEach({ print(String(describing: json?[$0])) })
}
正如其他人所提到的,这是一本字典,它不是为提供有序密钥而设计的。它被设计成具有快速散列查找功能,因此只需继续使用它就可以将事情按正确的顺序排列 我不确定为什么您需要某种有序字符串,因此这只是一个示例,供您按照所需顺序打印字符串:
if let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String : Any] {
["token", "timestamp", "client-nonce", "url"].forEach({ print(String(describing: json?[$0])) })
}
世界就是这样运转的。此外,如果字典键不按顺序排列会有什么影响?HMAC哈希将有所不同“有人知道我怎么做吗?”为什么要这样做?如果你能解释原因,那么人们也许能够提供明智的解决方案。如果您真的想这样做,那么字典(单独)是错误的数据结构。您需要一个数组,或者数组和字典的组合。字典本质上是无序的。数组是有序的。这适用于JSON和swift。然而,根据你对“为什么?”问题的回答,你最好还是继续使用字典,然后在需要时按一定顺序操作它的键。这就是世界的运作方式。此外,如果字典键不按顺序排列会有什么影响?HMAC哈希将有所不同“有人知道我怎么做吗?”为什么要这样做?如果你能解释原因,那么人们也许能够提供明智的解决方案。如果您真的想这样做,那么字典(单独)是错误的数据结构。您需要一个数组,或者数组和dict的组合