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

Swift解析Wikidata动态Key的JSON响应问题

解决Wikidata动态键的Codable解析问题

嘿,我懂你现在的困扰——Wikidata返回的entities字段里的键是像Q1169621这种动态生成的标识符,没法提前在Codable结构体里写死,对吧?这确实是用Codable处理这类JSON时的常见问题,我来给你一个简单直接的解决方案。

核心思路:用字典替代固定结构体类型

原来的InfoFromWikiConverted里把entities定义成了Locator类型,但实际上entities是一个键为动态QID、值为实体数据的字典结构。所以我们只需要把entities的类型改成[String: Locator],让JSONDecoder自动把动态键映射到字典的key中即可。

修改后的结构体代码

struct InfoFromWikiConverted: Codable { 
    let entities: [String: Locator] // 改为字典类型,适配动态键
} 
struct Locator: Codable { 
    let labels: Labels 
} 
struct Labels: Codable { 
    let en: EN 
} 
struct EN: Codable { 
    let value: String 
}

解析后获取目标值

解析完成后,你可以通过两种方式拿到目标值(比如"Jim Lauderdale"):

  1. 已知初始响应中的QID:直接用该QID作为字典的key取值
let decoder = JSONDecoder()
do {
    let wikiResponse = try decoder.decode(InfoFromWikiConverted.self, from: yourJsonData)
    // 假设从初始响应拿到的QID是"Q1169621"
    if let targetEntity = wikiResponse.entities["Q1169621"] {
        let targetName = targetEntity.labels.en.value
        print(targetName) // 输出 "Jim Lauderdale"
    }
} catch {
    print("解析失败:\(error.localizedDescription)")
}
  1. 未知QID,取第一个实体:如果响应里只有一个实体,直接取字典的第一个value
do {
    let wikiResponse = try decoder.decode(InfoFromWikiConverted.self, from: yourJsonData)
    if let firstEntity = wikiResponse.entities.values.first {
        let targetName = firstEntity.labels.en.value
        print(targetName)
    }
} catch {
    print("解析失败:\(error.localizedDescription)")
}

额外说明

如果你需要更复杂的处理逻辑(比如强制只取一个实体,或者对动态键做额外校验),也可以自定义init(from decoder: Decoder)方法来手动解析,但上面的字典方案是最简洁高效的,完全适配你当前的场景。

内容的提问来源于stack exchange,提问作者Benjamin B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:37:40