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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:01:35