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"):
- 已知初始响应中的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)") }
- 未知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.
相关产品推荐
相关产品推荐

