Ios 将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

我正在尝试使用以下方法将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"}

有人知道我如何做到这一点吗?

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

JSON对象是一个键值对,没有顺序,你不能对它排序,最后的顺序也不重要


有关更多详细信息,请检查

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

JSON对象是一个键值对,没有顺序,你不能对它排序,最后的顺序也不重要


要了解更多详细信息,请检查

仅使用字典和简单(单级)JSON无法做到这一点

字典在JSON和Swift(以及任何其他语言)中都是按自然顺序排列的。如果需要维护订单,则应使用数组

很难对您的问题给出一个具体的答案,因为您没有提供任何想要保持这种顺序的原因,也没有提供关于如何生成数据的性质的详细信息(例如,字典是否总是具有相同的键,它们是否应该始终处于相同的顺序?)

但是,如果确实需要维护顺序,并且您可以使用不同的JSON格式,则可以根据您的需求,通过以下两种方法之一来实现:

  • 如果钥匙总是一样的,顺序也是一样的
  • 从数组而不是原始字典填充JSON。因为您知道元素的顺序,所以不需要任何键就可以知道哪个元素是哪个元素

  • 如果键不总是相同的,或者不总是在相同的顺序中
  • 单独维护一个有序键数组以及字典,然后使用该数组以键在数组中存储的相同顺序访问字典值

    根据您的需求,您可能还需要将数组存储在JSON中(例如,与字典合并到父字典中)


    这可能有点含糊不清,但为了得到更好的答案,您可能需要提供更多关于您的实际需求的信息。

    仅使用字典和简单(单级)JSON无法做到这一点

    字典在JSON和Swift(以及任何其他语言)中都是按自然顺序排列的。如果需要维护订单,则应使用数组

    很难对您的问题给出一个具体的答案,因为您没有提供任何想要保持这种顺序的原因,也没有提供关于如何生成数据的性质的详细信息(例如,字典是否总是具有相同的键,它们是否应该始终处于相同的顺序?)

    但是,如果确实需要维护顺序,并且您可以使用不同的JSON格式,则可以根据您的需求,通过以下两种方法之一来实现:

  • 如果钥匙总是一样的,顺序也是一样的
  • 从数组而不是原始字典填充JSON。因为您知道元素的顺序,所以不需要任何键就可以知道哪个元素是哪个元素

  • 如果键不总是相同的,或者不总是在相同的顺序中
  • 单独维护一个有序键数组以及字典,然后使用该数组以键在数组中存储的相同顺序访问字典值

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