【发布时间】:2020-10-20 08:15:18
【问题描述】:
我有类似的 JSON 数据字符串结构,
data: {
"items": [
{
"kind": "customsearch#result",
"title": "XHAOYEAHX 40,60,110,150pcs Shoes Charms Fits ... - Amazon.com",
"snippet": "Buy XHAOYEAHX 40, 60, 110, 150pcs Shoes Charms Fits for Croc Clog Shoes \nWristband Bracelet Party Girls Boys Gifts (Fixed Designs 100pcs) and other ...",
"pagemap": {
"scraped": [
{
"image_link": "https://images-na.ssl-images-amazon.com/images/I/91H%2BUO%2BMDQL._AC_UY395_.jpg"
}
],
"cse_image": [
{
"src": "https://images-na.ssl-images-amazon.com/images/I/91H%2BUO%2BMDQL._AC_UY395_.jpg"
}
]
}
}
]}
我尝试将数据模型结构称为,
struct Items: Codable {
var title:String?
var snippet:String?
var pagemap : PageMap?
enum CodingKeys: String, CodingKey {
case title = "title"
case snippet = "snippet"
case pagemap = "pagemap"
}
init(from decoder: Decoder) throws {
do {
let values = try decoder.container(keyedBy: CodingKeys.self)
title = try values.decode(String.self, forKey: .title)
snippet = try values.decode(String.self, forKey: .snippet)
pagemap = try values.decode(PageMap.self, forKey: .pagemap)
} catch {
print(error.localizedDescription)
}
}
}
struct PageMap: Codable {
var cse_image: [Thumbnail]?
private enum CodingKeys: String, CodingKey {
case cse_image = "cse_image"
}
init(from decoder: Decoder) throws {
do {
let values = try decoder.container(keyedBy: CodingKeys.self)
cse_image = try values.decode([Thumbnail].self, forKey: .cse_image)
} catch {
print(error.localizedDescription)
}
}
}
struct Thumbnail: Codable {
let src: String?
enum CodingKeys: String, CodingKey {
case src = "src"
}
}
当我尝试调用此结构并通过 dec.keyDecodingStrategy = .convertFromSnakeCase 从图像的 src 字符串中获取数据时,显示无法读取数据的错误,因为它丢失了,我哪里出错了?
let url = URL(string: "https://www.googleapis.com/customsearch/v1?q=shoes&key=myID&cx=ursearchID")!
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if let error = error {
print("error: \(error)")
} else {
if let response = response as? HTTPURLResponse {
print("statusCode: \(response.statusCode)")
}
if let data = data, let dataString = String(data: data, encoding: .utf8) {
print("data: \(dataString)")
do{
let jsonStr = dataString
let dec = JSONDecoder()
dec.keyDecodingStrategy = .convertFromSnakeCase
let res = try dec.decode(Data.self, from: jsonStr.data(using:.utf8)!)
// self.items = [res]
for shop in res.items{
self.shoptitle.append(shop.title!)
self.shopsnippet.append(shop.snippet!)
self.items.append(shop)
print(shop.snippet)
print(shop.pagemap?.cse_image)
if shop.pagemap?.cse_image != nil {
for info in (shop.pagemap?.cse_image!)! {
print(info.src)
}
}
}
}
catch let error as NSError {
print("\(error)")
}
}
}
}
task.resume()
【问题讨论】:
-
你的 JSON 数据,不完美
-
你的根对象肯定不是
Data.self。在Codable上下文中从不print(error.localizedDescription)。仅打印error实例。而且结构中的大部分代码都是多余的。