无法将排序后的字典序列化为JSON - Swift 3

时间:2017-01-11 16:08:50

标签: ios json swift dictionary foundation

无法通过JSONSerialization.data(withJSONObject:options:)

将我的已排序字典序列化为JSON

序列化适用于未排序的字典,但是排序的应用程序会引发错误并带有描述:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (_SwiftValue)'

以下是我的方法的样子:

func createJSONFile(){
    // create path to json file
    let fileManager = FileManager.default
    let urls = fileManager.urls(for: .documentDirectory, in: .userDomainMask)
    let documentDirectory = urls[0] as NSURL
    guard let jsonURL = documentDirectory.appendingPathComponent("graphData") else {
        print("Failed to create path to json file.")
        return
    }

    print(jsonURL.absoluteString)
    // creating a .json file in the Documents folder
    if !fileManager.fileExists(atPath: jsonURL.absoluteString){
      fileManager.createFile(atPath: jsonURL.absoluteString, contents: nil, attributes: nil)
        print("file created")
    }

    do {
        let unsortedDic = self.tempDictionaryForJsonFile
        let sortedDic = unsortedDic.sorted(by: <)
        let jsonData = try JSONSerialization.data(withJSONObject: sortedDic, options: .prettyPrinted)
        print(jsonData)
        try jsonData.write(to: jsonURL)

        print(fileManager.fileExists(atPath: jsonURL.absoluteString))

        let content = try String.init(contentsOf: jsonURL, encoding: .utf8)
        print(content)

    } catch {
        print(error.localizedDescription)
    }
}

有趣的是,在检查器中,调试未排序的字典看起来像这样:unsorted dictionary并且排序看起来像这样sorted dictionary

请帮助解决此问题。

1 个答案:

答案 0 :(得分:1)

首先,Swift stdlib中没有排序目录(或者在JSON中没有排序目录; JSON对象是无序的)。当您在字典上调用.sorted()时,它会返回一组键/值对[(Key, Value)]

JSONSerialization有关于它可以序列化的规则:

  • 顶级对象是NSArray或NSDictionary。

  • 所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。

  • 所有字典键都是NSString的实例。

  • 数字不是NaN或无穷大。

从NS兼容集合到它们的NS等价物有隐式桥接,但是如果内容可以用ObjC表示(并且(Key, Value)不能表示),则只能得到这个。

如何正确实现这一点在很大程度上取决于tempDictionaryForJsonFile的类型和内容,这里没有给出。它还取决于你想要用“排序字典”(在JSON中不存在,所以没有办法从Swift获得它)实现的目标。如果你的意思是“一个有序的JSON对象数组,每个对象有一个键/值,”可以构建(但是你需要在使用这些数据时支持它)。