首页 > 解决方案 > 为什么编码键或 keyDecodingStrategy 不起作用?

问题描述

我正在尝试构建一个简单的应用程序,用户可以在其中搜索 GitHub 存储库,但由于无法正确解码 JSON,我的请求失败。我有一个名为“Search”的模型,如果我使用snake_case 表示法命名字段,则解码有效。但是,我想使用 camelCase 表示法并使用 decoderKeys 或 decoder.keyDecodingStrategy = .convertFromSnakeCase 但似乎没有一个工作,我想知道为什么

这是我的代码,即请求执行:

open class GetRepositoriesRequest: Request {

    var query: String
    public var headers: [String: String] = [:]
    public var parameters: [String: Any] = [:]
    public var method: RequestMethod = .GET
    public var apiAdress: String

    public init(query: String) {
        self.query = query
        self.apiAdress = "https://api.github.com/search/repositories?q=\(self.query)"
    }

    public func execute() {
        let decoder = JSONDecoder()
        let url = URL(string: self.apiAdress)!
        var request = URLRequest(url: url)
        request.httpMethod = self.method.rawValue
        let dataTask = URLSession.shared.dataTask(with: request) {
            data,response,error in
            do {
                guard let data = data else {
                    return
                }
                if let jsonResult = try? decoder.decode(Search.self, from: data) {
                    print(jsonResult)
                }
            } catch let error as NSError {
                print(error.localizedDescription)
            }
        }
        dataTask.resume()
    }
}

和型号:

struct Search: Codable {
    var totalCount: Double
    var incompleteResults: Bool
    var items: [Item]

    public enum SearchKeys: String, CodingKey {
        case totalCount = "total_count"
        case incompleteResults = "incomplete_results"
        case items
    }
}

struct Item: Codable {
    let id: Int
    let node_id:String
    let name: String
    let full_name: String
    let owner: Owner
}

struct Owner: Codable {
    let login: String
    let id: Int
    let node_id:String
}

标签: jsonswiftmodeldecoding

解决方案


哎呀,我自己找到了答案。我想我完全忘记了其他模型不是驼峰命名法。对此感到抱歉


推荐阅读