Swift 中的远程 JSON 解析对我来说是新事物,我花了数周时间试图解决这个问题。
我从中提取的 JSON 是这个人: http://www.odysseynewsmagazine.net/wp-json/wp/v2/posts?_embed
我试图为每个帖子获取图像的“source_url”,但它嵌套在“media_details”中,“media_details”又嵌套在“wp:featuredmedia”中,而“wp:featuredmedia”又嵌套在“_embedded”中,而且我不断收到错误。
我编写的代码如下所示:
func parseData() {
fetchedSlug = []
//from odyssey site
let url = "http://www.odysseynewsmagazine.net/wp-json/wp/v2/posts?_embed"
var request = URLRequest(url: URL(string: url)!)
request.httpMethod = "GET"
let configuration = URLSessionConfiguration.default
let session = URLSession(configuration: configuration, delegate: nil, delegateQueue: OperationQueue.main)
let task = session.dataTask(with: request) { (data, response, error) in
if error != nil {
print("Error")
}
else {
do {
let fetchedData = try JSONSerialization.jsonObject(with: data!, options: .mutableLeaves) as! NSArray
//Json objects to variables
for eachFetchedSlug in fetchedData {
let eachSlug = eachFetchedSlug as! [String: Any]
let slug = eachSlug["slug"] as! String
let link = eachSlug["link"] as! String
self.fetchedSlug.append(Slug(slug: slug, link: link))
}
self.slugTableView.reloadData()
}
catch {
print("Error2")
}
}
}
task.resume()
}
}//end of VC Class
class Slug {
//define variables
let slug: String?
let link: String?
init(slug: String?, link: String?) {
self.slug = slug
self.link = link
}
//creating dictionaries from Json objects
init(slugDictionary: [String : Any]) {
self.slug = slugDictionary["slug"] as? String
link = slugDictionary["link"] as? String
}
}
我还需要每个帖子的标题,可以在“标题”中的“渲染”中找到。
所有这些信息都填充在 tableView 内可重用的自定义单元格中的标签。我可以填充 slug 和链接标签,但不能填充任何嵌套信息。
“embedded”前面的下划线是怎么回事?这就是我什么都做不到的原因吗?我可以让它消失吗?在我向他们展示一个可用的应用程序之前,我不允许下载插件或运行自定义脚本。
最佳答案
请检查以下代码:
for eachFetchedSlug in fetchedData {
let eachSlug = eachFetchedSlug as! [String: Any]
let slug = eachSlug["slug"] as! String
let link = eachSlug["link"] as! String
self.fetchedSlug.append(Slug(slug: slug, link: link))
let title = eachSlug["title"] as! [String: Any]
let rendered = String(describing: title["rendered"])
print(rendered) // this is title
let embedded = eachSlug["_embedded"] as! [String: Any]
let wpfeaturedmedias = embedded["wp:featuredmedia"] as! [Any]
for wpfeaturedmedia in wpfeaturedmedias {
let featuredmedia = wpfeaturedmedia as! [String: Any]
let mediaDetails = featuredmedia["media_details"] as! [String: Any]
let mediaDetailsSize = mediaDetails["sizes"] as! [String: Any]
let mediaDetailsSizeThumbnail = mediaDetailsSize["thumbnail"] as! [String: Any] // getting only thumbnail. Based on you requirement change this to
let image = String(describing: mediaDetailsSizeThumbnail["source_url"])
print(image) // this is image
}
}
我添加了仅检索缩略图
的代码。在 sizes
中,有很多类型(medium
、medium_large
...)。根据您的要求,更改该值。
最好添加 if let 检查选项。因为那里有太多的转换。如果任何转换失败,它都会崩溃。
关于json - 在 Swift 中访问*远程* JSON 深层嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46335926/