You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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目录里的文件:

  1. 打开Xcode的Window > Devices and Simulators
  2. 选中你的应用,点击Download Container...
  3. 右键下载的容器文件,选择Show Package Contents
  4. 进入AppData > Documents,就能看到修改后的police_stations.json了

这样之后,每次启动应用都会读取Documents里的最新数据,修改也能正常保存啦!

内容的提问来源于stack exchange,提问作者Alexander Choi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:27:46