获取从JSON到字典再到JSON的意外转换
我试图从Bundle中的myFile.JSON读取一个JSON文件,修改一些元素并将其作为JSON文件存储在文档目录中。我认为这是一种保存数据的简单方法。随后,我打算读写文档目录。下面的代码显示了我所做的事情,并被大量注释。我似乎错过了一些重要的步骤,因为预期的JSON转换与JSON规范不匹配。我愿意接受关于如何在操场上测试的建议。代码基于获取从JSON到字典再到JSON的意外转换,json,swift3,jsonserializer,Json,Swift3,Jsonserializer,我试图从Bundle中的myFile.JSON读取一个JSON文件,修改一些元素并将其作为JSON文件存储在文档目录中。我认为这是一种保存数据的简单方法。随后,我打算读写文档目录。下面的代码显示了我所做的事情,并被大量注释。我似乎错过了一些重要的步骤,因为预期的JSON转换与JSON规范不匹配。我愿意接受关于如何在操场上测试的建议。代码基于 问题是您将dictionary对象保存到文件中,而不是保存编码的JSON 仅使用JSONSerialization从对象到数据,不要传递.prettypr
问题是您将dictionary对象保存到文件中,而不是保存编码的JSON 仅使用JSONSerialization从对象到数据,不要传递
.prettyprinted
do {
let jsonData = try JSONSerialization.data(withJSONObject: dict, options:[])
// here "jsonData" is the dictionary encoded in JSON data
let outString = String(data:jsonData, encoding:.utf8)
print("outString = \(outString)")
let url = saveJsonToFile("newFile", outString: outString )
print(url)
}
} catch {
print(error.localizedDescription)
}
vadian指出的问题是正确的,您正在存储Dictionary对象,但不是将
数据
转换为字符串
,然后写入字符串
,您可以直接在文档目录
中写入数据
因此,我更改了您的saveJsonToFile
函数,该函数接受Data
作为第二个参数,而不是String
func saveJsonToFile (_ fileName:String, jsonData: Data) -> URL {
let docDirectory = try? FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
if let fileURL = docDirectory?.appendingPathComponent(fileName).appendingPathExtension("json") {
print("fileURL = \(fileURL)")
// Write to a file on disk
do {
try jsonData.write(to: fileURL)
} catch {
print("Failed writing to URL: \(fileURL), Error: " + error.localizedDescription)
}
return fileURL
}
return URL(string: "")!
}
现在,在更改json结果并将其转换为数据后,只需调用此函数
do {
let jsonData = try JSONSerialization.data(withJSONObject: dict, options: [])
let url = saveJsonToFile("newFile", jsonData: jsonData )
print(url)
} catch {
print(error.localizedDescription)
}
您应该尝试[String:Any],而不是[String:AnyObject].Vadian-感谢您的快速响应和知识。答案对我来说应该很清楚,但它只是没有注册。
do {
let jsonData = try JSONSerialization.data(withJSONObject: dict, options: [])
let url = saveJsonToFile("newFile", jsonData: jsonData )
print(url)
} catch {
print(error.localizedDescription)
}