Swift中Bing API JSON解码问题:webPages类型定义错误排查
解决Bing API JSON解码中
webPages类型不匹配的问题 从你给出的错误信息和JSON结构来看,问题出在webPages的类型定义上——你用了嵌套字典,但实际返回的JSON里webPages是一个包含数组字段的对象,解码时自然会触发类型不匹配。
错误原因拆解
错误提示里明确指出了问题核心:
Expected to decode Dictionary<String, String> but found an array instead.
这个错误指向webPages.value字段:你原本把它当成了字典结构,但实际它是一个网页对象的数组,而且webPages本身也是一个包含多个属性的复杂对象,不是简单的字典嵌套。
正确的Codable结构定义
我们需要为webPages及其内部的value数组分别定义对应的结构体,完全匹配JSON的层级结构:
// 对应webPages.value里的单个网页对象 struct WebPageItem: Codable { let id: String let name: String let url: String let isFamilyFriendly: Bool let displayUrl: String let snippet: String let dateLastCrawled: String let language: String let isNavigational: Bool } // 对应外层的webPages对象 struct WebPages: Codable { let totalEstimatedMatches: Int let value: [WebPageItem] let someResultsRemoved: Bool } // 顶层的解码结构体(遵循Swift命名规范,结构体首字母大写) struct CodableData: Codable { let _type: String let queryContext: [String: String] let webPages: WebPages }
为什么这样定义?
- WebPageItem:精准匹配JSON中
webPages.value数组里的每个对象属性,所有字段类型和JSON完全对应(比如isFamilyFriendly是布尔值,totalEstimatedMatches是整数)。 - WebPages:对应JSON里的
webPages对象,包含三个属性:totalEstimatedMatches(整数)、value(WebPageItem数组)、someResultsRemoved(布尔值)。 - CodableData:将原本错误的
[String : [String : String]]替换为WebPages类型,完全贴合JSON的实际结构。
这样修改后,你再进行JSON解码就不会触发类型不匹配的错误了。
内容的提问来源于stack exchange,提问作者user20978107
相关产品推荐
相关产品推荐

