Swift开发:如何在Xcode中将JSON数据写入并保存至本地.json文件(含追加数据后无法保存的问题排查)
无法修改Xcode项目中本地JSON文件的解决方案
嗨,我明白你的问题了!你现在的代码其实已经成功把修改后的JSON写到了设备的Documents目录里,但项目里的police_stations.json没变化,核心原因很关键:
应用安装后,
Bundle.main里的文件是只读的——它属于应用安装包的一部分,编译时就被打包进去,运行时只能读取,完全没法直接修改项目里的原始JSON文件。
你的代码里已经用FileManager.default.urls(for: .documentDirectory...)把修改后的内容写到了Documents目录,只是你没去这个路径查看而已。下面是完整的修正方案,让你后续的读写都针对可修改的文件:
步骤1:封装获取可读写JSON文件URL的方法
先写一个工具方法,判断Documents目录里是否已有目标文件,如果没有,就从Bundle里复制一份过去(保证首次启动能拿到初始数据):
func getWritablePoliceStationsURL() -> URL? { let fileManager = FileManager.default // 获取Documents目录的目标文件URL guard let documentsDir = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first else { return nil } let targetURL = documentsDir.appendingPathComponent("police_stations.json") // 如果Documents里没有文件,从Bundle复制初始文件过去 if !fileManager.fileExists(atPath: targetURL.path) { guard let bundleURL = Bundle.main.url(forResource: "police_stations", withExtension: "json") else { return nil } do { try fileManager.copyItem(at: bundleURL, to: targetURL) } catch { print("复制初始文件失败:\(error)") return nil } } return targetURL }
步骤2:修改你的读写逻辑
现在用上面的方法获取可读写的URL,替换原来的Bundle URL,所有操作都针对Documents目录的文件:
do { guard let fileURL = getWritablePoliceStationsURL() else { print("无法获取可读写的文件URL") return } // 读取Documents里的最新JSON数据 let data = try Data(contentsOf: fileURL) let jsonDecoder = JSONDecoder() var parsedJSON = try jsonDecoder.decode([UserCoords].self, from: data) // 追加新的坐标数据 parsedJSON.append(UserCoords(lat: latitude, lng: longitude)) // 编码并写回Documents目录(.atomic选项保证写入失败时不会损坏原文件) let encodedData = try JSONEncoder().encode(parsedJSON) try encodedData.write(to: fileURL, options: .atomic) // 验证写入结果 let json = try JSONSerialization.jsonObject(with: encodedData, options: []) print("修改后的JSON内容:\(json)") print("文件已保存到路径:\(fileURL.path)") } catch { print("操作失败:\(error)") }
怎么验证修改后的文件?
你可以通过Xcode查看Documents目录里的文件:
- 打开Xcode的
Window > Devices and Simulators - 选中你的应用,点击
Download Container... - 右键下载的容器文件,选择
Show Package Contents - 进入
AppData > Documents,就能看到修改后的police_stations.json了
这样之后,每次启动应用都会读取Documents里的最新数据,修改也能正常保存啦!
内容的提问来源于stack exchange,提问作者Alexander Choi
相关产品推荐
相关产品推荐

