簡體   English   中英

Swift 4 Decodable解析數組中的json數據

[英]Swift 4 Decodable parsing json data in array

我從網絡服務解析數據時遇到問題,似乎可解碼協議無法解析此json 數據

這是我使用泛型解析的數據。

public func requestGenericData<T: Decodable>(urlString: String, httpMethod: String?, token: String!, completion: @escaping(T) ->()) {
    let fullStringUrl = url + urlString
    guard let url = URL(string: fullStringUrl) else { return }
    guard let token = token else { return }
    var urlRequest = URLRequest(url: url)
    urlRequest.setValue("application/json", forHTTPHeaderField: "accept")
    urlRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
    urlRequest.httpMethod = httpMethod
    URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
        if self.isInternetAvailable() {
            guard let data = data else { return }
            if let httpResponse = response as? HTTPURLResponse {
                if httpResponse.statusCode >= 200 && httpResponse.statusCode < 300 {
                    do {
                        let obj = try JSONDecoder().decode(T.self, from: data)
                        completion(obj)
                    } catch {
                        print("Error: \(String(describing: error))\n StatusCode: \(httpResponse.statusCode)")
                    }
                }
            }
        } else {
            showAlert(title: "No Internet Connect", message: "Please open your network and try again.", alertStyle: .alert, buttonTitle: "OK", buttonStyle: .default)
            return
        }
    }.resume()
}

這是我的模特

struct JobWithCategory: Decodable {
   let jobTypeID: Int
   let jobCategoryID: Int
   let name: String
   let getJobs: [getJobs]
}
struct getJobs: Decodable {
   let name: String
   let description: String
}
struct JobCategories: Decodable {
   let jobCategories: [JobWithCategory]
}


apiHelper.requestGenericData(urlString: "url/on/something/else", httpMethod: "GET", token: token) { (jobCategories: [JobCategories]) in
        print(jobCategories)
    }

現在我在控制台上打印了這個問題:

錯誤:typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[],debugDescription:“預計要解碼Array,但找到了字典。”,underlyingError:nil))

我的實現遺漏了什么或做錯了什么? 有人可以幫我解決這個問題,所以請詳細說明為什么會這樣,以便我可以很好地掌握代碼中發生的事情。

提前致謝 :)

因為你用

[JobCategories]

因為補全T被推斷為數組,所以

 T.self = [JobCategories].self

不是字典,所以試試看

apiHelper.requestGenericData(urlString: "url/on/something/else", 
  httpMethod: "GET", token: token) { (jobCategories:JobCategories) in
    print(jobCategories.jobCategories)
}

請閱讀錯誤消息

預期對Array進行解碼,但是找到了一個字典

預期的一面顯示您在做什么(錯誤), 找到的一面顯示實際類型。

Decodable而言,字典是一種結構。 所以是

...{ (jobCategories: JobCategories) in

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM