Swift 4.1中解析嵌套JSON遇未知错误求助
看起来你在解析嵌套JSON的时候卡壳了,普通JSON没问题但嵌套的就报错,结合你给出的代码,我给你梳理几个常见的问题和解决办法:
1. 先补全结构体的完整定义
你给出的EventProducer结构体代码截断了(let n...),这会直接导致编译错误,更别说正常解码了。首先得把这个结构体补全,确保所有属性都有完整的类型定义——比如如果JSON里EventProducer包含name字段,就写成let name: String?;所有非必填的属性尽量设为可选类型(带?),避免因为JSON里缺失字段导致解码失败。
2. 确认键名与JSON完全匹配
如果JSON里的字段名和你的结构体属性名不一致(比如JSON里是event_producer,但你结构体里写的是producer),解码就会失败。这种情况需要自定义CodingKeys枚举做映射,比如在ProducerData里添加:
enum CodingKeys: String, CodingKey { case id, name, login, producer = "event_producer" // 把JSON键名映射到结构体属性 case roles, config }
3. 检查嵌套类型、数组类型是否匹配
比如你定义的config是[String]?,但如果JSON里的config是一个字典({...})或者其他非数组类型,就会触发解码错误。一定要确保结构体属性类型和JSON对应字段的类型完全一致:数组对应数组、对象对应结构体、字符串对应字符串。
4. 加上错误捕获,看具体报错细节
很多时候你不知道问题出在哪,是因为没打印具体的解码错误。建议用do-catch块包裹解码代码,把错误信息打出来——它会明确告诉你是哪个键不匹配、哪个类型不对:
// 假设你已经把JSON字符串转成了Data let jsonData = yourJSONString.data(using: .utf8)! do { let producer = try JSONDecoder().decode(Producer.self, from: jsonData) print("解码成功啦!\(producer)") } catch { print("解码错误详情:\(error)") }
比如如果是类型不匹配,错误信息会显示Expected to decode Array<String> but found a dictionary instead,这样你就能精准定位问题。
完整示例参考
假设你的目标JSON结构是这样的:
{ "data": { "id": 1, "name": "Joel's Producer", "login": "joel_junior", "producer": { "id": 101, "name": "Event Studio" }, "roles": ["manager", "creator"], "config": ["theme_dark", "notifications_on"] }, "messages": ["Load successful"], "success": 1 }
对应的完整结构体应该是:
import Foundation struct Producer: Decodable { var data: ProducerData? var messages: [String]? var success: Int? } struct ProducerData : Decodable { let id: Int? let name: String? let login: String? let producer: EventProducer? let roles: [String]? let config: [String]? } struct EventProducer : Decodable { let id: Int? let name: String? // 补全你之前截断的属性 }
按照上面的步骤逐一排查,应该能快速找到问题所在!
内容的提问来源于stack exchange,提问作者Joel Júnior

