将NSDictionary转换为Json String会导致元素重新排序

时间:2016-12-01 02:55:35

标签: 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返回的内容:

{"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"}

有谁知道我该怎么做?

3 个答案:

答案 0 :(得分:3)

您不能也不应该依赖JSON对象中元素的排序。

JSON对象是一个键值对,没有订单,您无法对其进行排序,最后一个订单无关紧要

有关详情,请查看json.org

答案 1 :(得分:0)

你不能只使用字典和平面(单级)JSON。

字典本质上是无序的,包括JSON和Swift(以及任何其他语言)。如果您需要维护订单,则应使用数组。

很难对您的问题给出具体的答案,因为您还没有提供任何理由来维护此订单,也没有提供有关数据生成方式的详细信息(例如,字典是否总是具有相同的键,并且它们是否总是以相同的顺序?)。

但是,如果确实需要维护顺序,并且如果您可以使用不同的JSON格式,则可以通过以下两种方法之一来完成,具体取决于您的要求:

  1. 如果按键总是相同且顺序相同......
  2. 从数组填充您的JSON,而不是从原始字典填充。由于您知道元素的顺序,因此您知道哪个元素不需要任何键。

    1. 如果密钥并不总是一样,那么OR并不总是按照相同的顺序......
    2. 单独维护一系列有序键以及字典,然后使用该数组以与存储在数组中的键相同的顺序访问字典值。

      根据您的要求,您可能需要将数组存储在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])) })
}