无法通过JSONSerialization.data(withJSONObject:options:)
序列化适用于未排序的字典,但是排序的应用程序会引发错误并带有描述:
*** 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
请帮助解决此问题。
答案 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对象数组,每个对象有一个键/值,”可以构建(但是你需要在使用这些数据时支持它)。