AlamoFire 4.0 + SwiftyJSON 展开深度嵌套的 JSON

Posted

技术标签:

【中文标题】AlamoFire 4.0 + SwiftyJSON 展开深度嵌套的 JSON【英文标题】:AlamoFire 4.0 + SwiftyJSON Unwrapping deeply nested JSON 【发布时间】:2016-10-11 22:19:25 【问题描述】:

我在解析从 Wiki API 返回的 JSON 时遇到问题。

Pod 文件:

platform :ios, ’10.0’

inhibit_all_warnings!
use_frameworks!

target 'GemFinder' do

    pod 'Alamofire', '~> 4.0’
    pod 'SwiftyJSON', :git => 'https://github.com/appsailor/SwiftyJSON.git', :branch => 'swift3'

end

Swift 代码:

import UIKit
import Alamofire
import SwiftyJSON

class WikiAPI: NSObject 
    
    func MineralRequest(minID: (String)) 
        
        Alamofire.request("https://en.wikipedia.org/w/api.php?action=query&titles=\(minID)&exintro=1&prop=pageimages%7Cextracts&format=json&pithumbsize=300", parameters: ["query": "pages"]).responseJSON  response in
            
            if let values = response.result.value as? [String: AnyObject] 
                
                let json = JSON(values)
                
                // Returns null
                print("otherJSON: \(json["query"]["pages"][0]["extract"])")
                
                
                let JSONvalues = values as NSDictionary
                print("JSONvalues: \(JSONvalues)")

                // This is also working to retrieve everything from below "query"
                let parse = JSONvalues.object(forKey: "query")
                print("Parse: \(parse)")
                
                let queryValues = values["query"]
                
                // Returns nested "pages" object, but I need to go deeper.
                print("queryvalues: \(queryValues?["pages"])")
                
            
        
    

当然,我能够得到响应,并尝试更深入,但在尝试解包时我不断收到空值。

我错过了什么?这是树的图像。我正在尝试提取标题、图像和摘录。

JSON response preview

按照此处所示的这种格式,仍然会产生空值。参数似乎也没有受益:How do I access a nested JSON value using Alamofire and SwiftyJSON?

【问题讨论】:

【参考方案1】:

“pages”值是一个字典,所以在上面使用[0] 是行不通的,你需要使用键来代替:

print("otherJSON: \(json["query"]["pages"]["1895477"]["extract"])")

或者如果页面中有很多项目并且你想要它们,你可以像这样迭代它:

let pages = json["query"]["pages"]
for (_,page) in pages 
    print(page["extract"])

【讨论】:

第一部分有效,但经过更多调查,我注意到 pages.values 抛出错误。说 JSON 没有成员“值”。是否有另一种方法可以在不将 JSON 转换为其他内容的情况下做到这一点? @softdownfeathers 不客气:)我用正确的 SwiftyJSON 循环语法更新了答案。

以上是关于AlamoFire 4.0 + SwiftyJSON 展开深度嵌套的 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何使用参数 swift 3.0 Alamofire 4.0 调用邮政服务?

上传时 Alamofire 4.0 模棱两可的参考

Swift 3.0 Alamofire 4.0 - Domain=NSURLErrorDomain Code=-999 “取消”

在 Alamofire 4.0 中初始化 SessionManager

我的旧项目将 Alamofire 更新到 4.0 版时遇到错误

Alamofire 4.0 上的“类型‘任何’没有下标成员”错误