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

SwiftUI中解码嵌套JSON报错:Google自定义搜索API遇items键缺失问题

问题解决:Google自定义搜索API解码keyNotFound错误

核心问题:URL构造错误

你的代码里URL拼接存在两处语法错误,导致请求返回的不是预期的搜索结果JSON,因此解码时找不到items字段:

  1. \(apiKey)后面多了一个多余的右括号),破坏了URL参数结构
  2. num(5)是错误的参数格式,URL查询参数需要用=连接键值对,正确写法是num=5

修复后的URL构造代码

guard let url = URL(string: "\(url)key=\(apiKey)&cx=\(searchEngineId)&q=\(query)&num=5") else {
    print("Invalid URL")
    return
}

额外排查建议

如果修复后仍有问题,可以在loadData中添加日志,查看实际的HTTP响应状态码和返回内容,确认API返回的JSON结构是否符合预期:

do {
    let (data, response) = try await URLSession.shared.data(from: url)
    
    // 打印HTTP状态码,判断请求是否成功
    if let httpResponse = response as? HTTPURLResponse {
        print("Status code: \(httpResponse.statusCode)")
    }
    
    // 打印返回的JSON字符串,检查结构是否包含items字段
    if let responseString = String(data: data, encoding: .utf8) {
        print("Response content: \(responseString)")
    }
    
    do {
        let decodedResponse = try JSONDecoder().decode(Response.self, from: data)
        responseItems = decodedResponse.items
    } catch {
        print("Decoding error: \(error)")
    }
} catch {
    print("Request error: \(error)")
}

可选优化:结构体命名规范

建议将嵌套的Items结构体改为单数Item,更符合Swift命名习惯:

struct Response: Codable {
    let items: [Item]
    
    struct Item: Codable {
        let title: String
        let link: String
    }
}

内容的提问来源于stack exchange,提问作者workbytaylor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:35:33