Ios 无法将排序字典序列化为JSON-Swift 3
无法通过Ios 无法将排序字典序列化为JSON-Swift 3,ios,json,swift,dictionary,foundation,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 creat
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)
}
}
func createJSONFile(){
//创建json文件的路径
让fileManager=fileManager.default
让URL=fileManager.URL(对于:.documentDirectory,在:.userDomainMask中)
将documentDirectory=URL[0]设为NSURL
guard let jsonURL=documentDirectory.appendingPathComponent(“graphData”)else{
打印(“未能创建json文件的路径”)
返回
}
打印(jsonURL.absoluteString)
//在Documents文件夹中创建.json文件
如果!fileManager.fileExists(atPath:jsonURL.absoluteString){
fileManager.createFile(atPath:jsonURL.absoluteString,内容:nil,属性:nil)
打印(“已创建文件”)
}
做{
让unsortedDic=self.tempDictionaryForJsonFile
让sortedDic=unsortedDic.sorted(按:首先,Swift stdlib中没有已排序的目录(或JSON中没有已排序的目录;JSON对象是无序的)。在字典上调用.sorted()
时,它返回一个键/值对数组[(键,值)]
JSONSerialization
有关于它可以序列化什么的规则:
- 顶级对象是NSArray或NSDictionary
- 所有对象都是NSString、NSNumber、NSArray、NSDictionary或NSNull的实例
- 所有字典键都是NSString的实例
- 数字不是NaN或无穷大
从与NS兼容的集合到它们的NS等价集合之间存在隐式桥接,但只有当内容可以用ObjC表示时(并且(Key,Value)
不能用ObjC表示),才能得到这种桥接
如何正确地实现这一点在很大程度上取决于tempDictionaryForJsonFile
的类型和内容,这里没有给出这些内容。这还取决于您试图使用“排序字典”(JSON中不存在,因此无法从Swift获得)实现什么“一个JSON对象的有序数组,每个对象都有一个键/值”,可以构建(但在任何使用此数据的情况下都需要支持它)使用.enumerate数组并构造一个字典,其中键是转换为字符串的[Float]数组的索引,值是也转换为字符串的数组各自的值。最后,结果表明此输出字典具有无序键。“最后,结果表明此输出字典具有无序键。”。“正确。所有Swift字典都有无序键(JSON对象也有无序键)。这是一个问题吗?不清楚为什么要将这些数字转换为字符串;这非常奇怪且容易出错(如果要排序,则无法正确排序)。这似乎非常复杂。如果您有[Float]
已经,为什么不序列化它呢?或者[Record]
,其中Record
将有采样时间,X和Y浮动?感谢您的友好回答。在您发布它之前,我已经设法将图形数据序列化到[[String:Float]]数组,其中String是Y值(Float)的索引因此,我有一个JSON文件,其内容如下:[{“index”:value},{“index”:value…}。这是面试测试任务的一部分。