Swift Playground中JSON解码后无法打印ID问题求助
解决Swift Playground中JSON解码无输出的问题
问题原因及对应解决方案
1. 未执行解码函数
你只定义了loadJson函数,但没有在代码中调用它,导致解码逻辑根本没运行,控制台自然没有输出。
解决方法:在代码末尾添加函数调用,替换成你的JSON文件名(不带.json后缀):
// 调用解码函数 _ = loadJson(filename: "你的JSON文件名")
2. JSON文件内容错误
你提供的JSON文件里包含了Swift代码let json = """和结尾的""",这不是纯JSON格式,会导致解码失败,但Playground的特性可能不会抛出明显错误提示。
解决方法:修改JSON文件,只保留纯JSON结构:
{ "id": "1", "options": [ { "id": "11", "options": [ { "id": "111", "options": [] } ] }, { "id": "2", "options": [ { "id": "21", "options": [] }, { "id": "22", "options": [ { "id": "221", "options": [] } ] } ] } ] }
3. Playground中Bundle.main无法正确定位JSON文件
Playground的资源文件处理逻辑和普通Xcode项目不同,Bundle.main可能找不到你添加的JSON文件。
解决方法:修改loadJson函数,使用Playground兼容的方式读取文件:
func loadJson(filename fileName: String) -> People? { // 获取Playground所在目录的URL guard let playgroundURL = Bundle.main.resourceURL?.deletingLastPathComponent().deletingLastPathComponent() else { print("无法获取Playground路径") return nil } let fileURL = playgroundURL.appendingPathComponent("\(fileName).json") do { let data = try Data(contentsOf: fileURL) let decoder = JSONDecoder() let jsonData = try decoder.decode(People.self, from: data) print(jsonData.id) return jsonData } catch { print("error:\(error)") return nil } }
或者更简单的方式:直接把JSON内容内嵌到Playground代码中,彻底避免文件路径问题:
struct People: Codable { let id: String let options: [People] } // 内嵌JSON内容 let jsonString = """ { "id": "1", "options": [ { "id": "11", "options": [ { "id": "111", "options": [] } ] }, { "id": "2", "options": [ { "id": "21", "options": [] }, { "id": "22", "options": [ { "id": "221", "options": [] } ] } ] } ] } """ // 解码逻辑 if let jsonData = jsonString.data(using: .utf8) { do { let result = try JSONDecoder().decode(People.self, from: jsonData) print(result.id) } catch { print("error:\(error)") } }
验证步骤
- 确保JSON文件是纯JSON格式,无Swift代码包裹
- 确保调用了解码函数
- 选择适合Playground的文件读取方式,或直接内嵌JSON内容
内容的提问来源于stack exchange,提问作者user8705895
相关产品推荐
相关产品推荐

