我正在尝试使用以下内容将NSDictionary对象转换为json字符串:
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"}
有谁知道我该怎么做?
答案 0 :(得分:3)
答案 1 :(得分:0)
你不能只使用字典和平面(单级)JSON。
字典本质上是无序的,包括JSON和Swift(以及任何其他语言)。如果您需要维护订单,则应使用数组。
很难对您的问题给出具体的答案,因为您还没有提供任何理由来维护此订单,也没有提供有关数据生成方式的详细信息(例如,字典是否总是具有相同的键,并且它们是否总是以相同的顺序?)。
但是,如果确实需要维护顺序,并且如果您可以使用不同的JSON格式,则可以通过以下两种方法之一来完成,具体取决于您的要求:
从数组填充您的JSON,而不是从原始字典填充。由于您知道元素的顺序,因此您知道哪个元素不需要任何键。
单独维护一系列有序键以及字典,然后使用该数组以与存储在数组中的键相同的顺序访问字典值。
根据您的要求,您可能需要将数组存储在JSON中(例如,将您的字典与父字典结合使用)。
这可能有些麻烦,但为了得到更好的答案,您可能需要提供更多有关您的要求的信息。
答案 2 :(得分:0)
正如其他人所提到的那样,它是一本字典,它不是为了提供有序键而设计的。它被设计为具有快速哈希查找,因此请继续使用它来按正确的顺序排列。
我不确定为什么你想要某种有序的字符串,所以这只是一个例子,你可以按照你想要的顺序打印字符串:
if let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [String : Any] {
["token", "timestamp", "client-nonce", "url"].forEach({ print(String(describing: json?[$0])) })
}