Swift 4解析嵌套JSON出错,求帮忙排查问题
解决Swift 4解析嵌套JSON的问题
我帮你排查出问题啦!核心问题是JSON结构和你的模型类型不匹配,咱们一步步来修复:
问题分析
先看你提供的JSON结构:
{ "results": { "AF": { "alpha3": "AFG", "currencyId": "AFN", "currencyName": "Afghan afghani", "currencySymbol": "؋", "id": "AF", "name": "Afghanistan" }, "AI": { "alpha3": "AIA", "currencyId": "XCD", "currencyName": "East Caribbean dollar", "currencySymbol": "$", "id": "AI", "name": "Anguilla" } } }
这里的results是一个以国家代码为键、Country对象为值的字典(类型是[String: Country]),但你代码里把Results类的results属性声明成了[Country]数组,类型完全不匹配,这就是解析失败的根本原因。
修复步骤
1. 修正模型类型
首先把Results和Country的定义改成正确的类型,建议用struct(Swift里值类型更适合数据模型),并且利用Codable的自动合成能力,不需要手动写init:
struct Results: Codable { let results: [String: Country] // 这里改成字典类型 } struct Country: Codable { let alpha3: String let currencyId: String let currencyName: String let currencySymbol: String let id: String let name: String }
如果坚持用class也可以,但struct更简洁且适合模型场景。
2. 执行解析操作
接下来用JSONDecoder来完成解析,示例代码如下:
// 假设你的JSON数据已经转换成Data类型 let jsonString = """ { "results": { "AF": { "alpha3": "AFG", "currencyId": "AFN", "currencyName": "Afghan afghani", "currencySymbol": "؋", "id": "AF", "name": "Afghanistan" }, "AI": { "alpha3": "AIA", "currencyId": "XCD", "currencyName": "East Caribbean dollar", "currencySymbol": "$", "id": "AI", "name": "Anguilla" } } } """ let jsonData = jsonString.data(using: .utf8)! do { let decodedResults = try JSONDecoder().decode(Results.self, from: jsonData) // 解析成功,访问数据 for (countryCode, country) in decodedResults.results { print("国家代码:\(countryCode),名称:\(country.name),货币:\(country.currencyName)") } } catch { print("解析失败:\(error.localizedDescription)") // 如果需要更详细的错误信息,可以打印error本身 // print(error) }
额外提示
- 如果你的JSON里有和Swift关键字冲突的字段,可以用
CodingKeys枚举来映射,比如如果字段名是class,就可以自定义编码键。 - 解析失败时,打印完整的
error对象(而不是只打印localizedDescription),能得到更精准的错误原因,比如哪个字段不匹配。
内容的提问来源于stack exchange,提问作者Todd Page
相关产品推荐
相关产品推荐

