Swift 4中从URL解析JSONObject遇到问题求助
在Swift 4中解析指定API的JSON数据
嘿,我太懂这种“看起来简单结果卡半天”的感觉了!我来带你一步步搞定Swift 4里解析这个API返回的JSON数据~
首先咱们先理清楚这个API的返回结构:它返回一个包含images数组的JSON对象,数组里的每一项是单张图片的信息(比如imageid、imageurl_lg这些字段)。Swift 4+的Codable协议是解析JSON的绝佳工具,咱们就用它来实现。
第一步:定义对应的数据模型
先创建两个遵循Codable协议的结构体,完美匹配JSON的结构:
struct ImageResponse: Codable { let images: [Image] } struct Image: Codable { let imageid: String let imageurl_lg: String // 如果后续需要用到其他字段,直接在这里添加对应的属性就行 }
第二步:发起网络请求并解析数据
接下来写一个函数,用URLSession发起请求,然后把返回的JSON数据解析成咱们定义的模型:
func fetchAndParseImages() { // 先确保URL是有效的 guard let requestUrl = URL(string: "http://api.geekdo.com/api/images?ajax=1&gallery=all&nosession=1&objectid=127023&objecttype=thing&pageid=357&showcount=1&size=thumb&sort=recent") else { print("哎呀,URL格式不对!") return } // 发起异步网络请求 let dataTask = URLSession.shared.dataTask(with: requestUrl) { data, response, error in // 先处理请求错误 if let error = error { print("请求出错啦:\(error.localizedDescription)") return } // 确认有数据返回 guard let responseData = data else { print("啥数据都没收到呀...") return } do { // 用JSONDecoder解析数据到咱们的模型里 let imageResponse = try JSONDecoder().decode(ImageResponse.self, from: responseData) // 这里就可以拿到解析后的结果啦,比如取第一张图片的信息 if let firstImage = imageResponse.images.first { print("图片ID:\(firstImage.imageid)") print("大图链接:\(firstImage.imageurl_lg)") } // 如果要更新UI,记得切回主线程哦! DispatchQueue.main.async { // 这里写更新UI的代码,比如展示图片 } } catch let decodeError { print("解析JSON出错了:\(decodeError.localizedDescription)") // 想看更详细的错误信息,可以直接打印decodeError print(decodeError) } } // 别忘了启动任务! dataTask.resume() }
重要注意事项
ATS配置:这个API用的是
http协议,而iOS 9+默认要求用HTTPS,所以你需要在Info.plist里配置ATS(App Transport Security)来允许这个域名的HTTP请求:
推荐用更安全的“指定允许域名”方式,在Info.plist里添加以下配置:<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>geekdo.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>线程问题:网络请求是在后台线程执行的,如果要更新UI(比如把图片显示出来),一定要用
DispatchQueue.main.async切回主线程,不然会崩溃哦。字段自定义映射:如果JSON里的字段名和你Swift里的属性名想不一样(比如把
imageurl_lg改成largeImageUrl),可以在Image结构体里添加CodingKeys枚举来映射:struct Image: Codable { let imageId: String let largeImageUrl: String enum CodingKeys: String, CodingKey { case imageId = "imageid" case largeImageUrl = "imageurl_lg" } }
这样你就可以成功解析这个API返回的JSON数据啦!
内容的提问来源于stack exchange,提问作者MakiCodes
相关产品推荐
相关产品推荐

