You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()
}

重要注意事项

  1. 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>
    
  2. 线程问题:网络请求是在后台线程执行的,如果要更新UI(比如把图片显示出来),一定要用DispatchQueue.main.async切回主线程,不然会崩溃哦。

  3. 字段自定义映射:如果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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:48:44