gpt4 book ai didi

json - URLSession 类型不匹配错误

转载 作者:搜寻专家 更新时间:2023-11-01 07:02:30 31 4
gpt4 key购买 nike

尝试使用 Swift jSon 解码器解析 json 时出现类型不匹配错误。

我只是找不到正常解析它的方法。

错误:

typeMismatch(Swift.String, Swift.DecodingError.Context(codingPath:
[CodingKeys(stringValue: "data", intValue: nil),
CodingKeys(stringValue: "itemArr", intValue: nil),
CodingKeys(stringValue: "price", intValue: nil)], debugDescription:
"Expected to decode String but found a number instead.",
underlyingError:
nil))

解码器代码:

 func getDealDetails(id : String ,completion : @escaping ()->())
{
let jsonUrl = "https://androidtest.inmanage.com/api/1.0/android/getDeal_\(id).txt"
guard let url = URL(string: jsonUrl) else { return }

URLSession.shared.dataTask(with: url) { (data, response, error) in

guard let data = data else { return }

do
{
let deal = try JSONDecoder().decode(ResultDetails.self, from: data)
AppManager.shared.dealToShow = deal.data.itemArr

}catch
{
print("There's an error: \(error)")
}

completion()

}.resume()



}
}

还有类:

首先:

class ResultDetails : Decodable
{
let data : DataDetails

init(data : DataDetails) {
self.data = data
}


}

第二个:

class DataDetails : Decodable
{
let itemArr: ItemArr

init(itemArr: ItemArr) {
self.itemArr = itemArr
}
}

第三:

class ItemArr : Decodable
{
let id, title, price, description: String
let image: String
let optionsToShow: Int
let gps: Gps
let website, phone: String

init(id: String, title: String, price: String, description: String, image: String, optionsToShow: Int, gps: Gps, website: String, phone: String) {
self.id = id
self.title = title
self.price = price
self.description = description
self.image = image
self.optionsToShow = optionsToShow
self.gps = gps
self.website = website
self.phone = phone
}

我想我在过去 6 个小时里尝试了所有方法来修复它,请帮忙!

编辑:

我放错了第三类。现在是正确的

最佳答案

报错信息不对。根据 JSON 链接和你的类,它应该是

CodingKeys(stringValue: "price", intValue: nil)], debugDescription: Expected to decode Int but found a string/data instead.,

但是它会准确地告诉您哪里出了问题:键 price 的值是 String 而不是 Int

您必须仔细阅读 JSON。格式非常简单。例如双引号中的所有都是String没有异常(exception)。


你的数据结构太复杂了。使用结构并删除初始值设定项。顺便说一句,ItemsArrItemAr 有错别字,并且没有键 orderNum

关键字image 可以解码为URL。这足够了

struct ResultDetails : Decodable {
let data : DataDetails
}

struct DataDetails : Decodable {
let itemArr: ItemArr
}

struct ItemArr : Decodable {
let id, title: String
let price: String
let image: URL
// let orderNum: Int
}

仅当您想要映射键时才指定CodingKeys。在您的情况下,您甚至可以省略 CodingKeys,而是使用 convertFromSnakeCase 策略。

decoder.keyDecodingStrategy = .convertFromSnakeCase

关于json - URLSession 类型不匹配错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50296358/

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