SwiftUI从WordPress API取数:无法访问og_image的url字段
解决SwiftUI解析WordPress API中yoast_head_json.og_image.url的问题
问题根源
- 错误的解码器配置:你在
loadData中设置了decoder.dataDecodingStrategy = .base64,这完全没必要——API返回的是标准JSON格式,不是Base64编码的数据,这个设置会导致解码失败,进而无法正确解析yoast_head_json中的字段。 - 数组访问方式错误:
og_image是数组类型,你不能直接把整个数组传给Text,需要访问数组中的元素(比如第一个元素)的url属性,同时要处理可选值(数组可能为空)。
修正步骤
1. 修复解码器配置
在loadData函数中删除错误的解码器配置,同时改用do-catch捕获解码错误,方便排查问题:
func loadData() { guard let url = URL(string: "https://xboxdynasty.de/wp-json/wp/v2/posts/") else { print("Invalid URL") return } let request = URLRequest(url: url) URLSession.shared.dataTask(with: request) {data, response, error in if let data = data { let decoder = JSONDecoder() do { let decodedResponse = try decoder.decode([UpcomingGames].self, from: data) DispatchQueue.main.async { self.upcominggames = decodedResponse } } catch { print("解码失败:\(error.localizedDescription)") } return } print("Fetch failed: \(error?.localizedDescription ?? "Unknown error")") }.resume() }
2. 优化结构体(可选但推荐)
为了避免因API返回字段缺失导致解码失败,建议将结构体中可能为空的字段设为可选类型:
struct Title: Codable { let title: String? let description: String? let author: String? let ogimage: [OgImage]? enum CodingKeys: String, CodingKey { case title case description case author case ogimage = "og_image" } } struct OgImage: Codable { let width, height: Int? let url: String? let type: String? }
3. 正确访问og_image的url
在ContentView中,通过可选链安全访问数组元素的url,并处理空值情况:
// 替换你注释掉的代码,示例放在HStack中 if let firstImage = item.yoastHeadJSON.ogimage?.first, let imageUrl = firstImage.url { Text(imageUrl) .font(.caption) } else { Text("无图片") .font(.caption) }
验证效果
修改后重新运行,应该能正确解析og_image的url字段。如果仍有问题,可以通过do-catch打印的错误信息,定位具体不匹配的字段。
内容的提问来源于stack exchange,提问作者Patrick Egger
相关产品推荐
相关产品推荐

