获取从JSON到字典再到JSON的意外转换

获取从JSON到字典再到JSON的意外转换,json,swift3,jsonserializer,Json,Swift3,Jsonserializer,我试图从Bundle中的myFile.JSON读取一个JSON文件,修改一些元素并将其作为JSON文件存储在文档目录中。我认为这是一种保存数据的简单方法。随后,我打算读写文档目录。下面的代码显示了我所做的事情,并被大量注释。我似乎错过了一些重要的步骤,因为预期的JSON转换与JSON规范不匹配。我愿意接受关于如何在操场上测试的建议。代码基于 问题是您将dictionary对象保存到文件中,而不是保存编码的JSON 仅使用JSONSerialization从对象到数据,不要传递.prettypr

我试图从Bundle中的myFile.JSON读取一个JSON文件,修改一些元素并将其作为JSON文件存储在文档目录中。我认为这是一种保存数据的简单方法。随后,我打算读写文档目录。下面的代码显示了我所做的事情,并被大量注释。我似乎错过了一些重要的步骤,因为预期的JSON转换与JSON规范不匹配。我愿意接受关于如何在操场上测试的建议。代码基于


问题是您将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)
}