json - 在 Swift 中访问*远程* JSON 深层嵌套对象

标签 json swift wordpress custom-cell

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 中,有很多类型(mediummedium_large ...)。根据您的要求,更改该值。

最好添加 if let 检查选项。因为那里有太多的转换。如果任何转换失败,它都会崩溃。

关于json - 在 Swift 中访问*远程* JSON 深层嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46335926/

相关文章:

python - 将嵌套的 mongoDB 文档转换为平面 pandas DataFrame(对象数组中的对象数组)

ios - 具有最大长度的 UITextField 自动完成

jquery - 滚动时 Wordpress Logo 更改

swift - 自动布局 [Snapkit] 更改旋转约束

php - Bootstrap Tour 在第一步循环 [wordpress]

php - 在 Woocommerce 的下拉变体属性选项中显示价格和库存状态

java - 需要 bean 的 JSONObject 构造函数不会映射父类(super class)中的属性

Python - 是否可以让logging.handlers.httpHandler将内容 header 设置为JSON而不诉诸自定义代码?

c# - C# DataContracts 的表现力是否足以正确描述 GeoJSON?

ios - 当我在 block 中使用 self 时,我得到一个 nil。但是 self 没有释放