gpt4 book ai didi

ios - 无法解码 JSON,因为缺少 Content-Type

转载 作者:搜寻专家 更新时间:2023-11-01 05:54:43 26 4
gpt4 key购买 nike

我的 JSONDecoder().decode 无法将数据解码为 json 格式,因为服务器响应具有这样的 Content-Type "*\*;charset=utf8"。

遇到这种情况我该怎么办?有任何想法吗? API link

我的代码:

private static let livePhotoUrlString = "https://m1.kappboom.com/livewallpapers/info?o=0&v=575"

static func getLivePhotos(completionHandler: @escaping (([LivePhoto]) -> Void)) {
guard let livePhotoUrl = URL(string: livePhotoUrlString) else { return }
let semaphore = DispatchSemaphore(value: 0)

URLSession.shared.dataTask(with: livePhotoUrl) { (data, response, error) in
do {
guard let data = data else { return }
let livePhotos = try JSONDecoder().decode([LivePhoto].self, from: data)
completionHandler(livePhotos)
} catch {
completionHandler([])
}
semaphore.signal()
}.resume()
semaphore.wait()
}

我的实体(LivePhoto):

class LivePhoto: Decodable {

init(smallUrl: String, largeUrl: String, movieUrl: String, id: Int, isLocked: Bool, promotionalUnlock: Bool) {
self.smallUrl = smallUrl
self.largeUrl = largeUrl
self.movieUrl = movieUrl
self.id = id
self.isLocked = isLocked
self.promotionalUnlock = promotionalUnlock
}

var smallUrl: String
var largeUrl: String
var movieUrl: String
var id: Int
var isLocked: Bool
var promotionalUnlock: Bool
}

响应头:

response headers

正确响应(另一个API):

correct response

最佳答案

错误与内容类型无关。

不是忽略 catch block 中的错误打印它,解码错误是非常具有描述性的。

} catch {
print(error)
completionHandler([])
}

它说

keyNotFound(CodingKeys(stringValue: "smallUrl", intValue: nil), Swift.DecodingError.Context(codingPath: [_JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "No value associated with key CodingKeys(stringValue: \"smallUrl\", intValue: nil) (\"smallUrl\").", underlyingError: nil))

您可以立即看到键是 small_url 而您的结构成员是 smallUrl

最简单的解决方案是添加convertFromSnakeCase键解码策略

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let livePhotos = try decoder.decode([LivePhoto].self, from: data)

并且您不需要类中的init 方法。将其声明为具有常量成员的结构

struct LivePhoto: Decodable {
let smallUrl, largeUrl, movieUrl: String
let id: Int
let isLocked: Bool
let promotionalUnlock: Bool
}

请删除这个可怕的信号量。无论如何,当您使用完成处理程序时,这是毫无意义的。

关于ios - 无法解码 JSON,因为缺少 Content-Type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54493871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com