如何使用 Alamofire 在 Swift 3 中解析 JSON?

Posted

技术标签:

【中文标题】如何使用 Alamofire 在 Swift 3 中解析 JSON?【英文标题】:How to Parse JSON in Swift 3 using Alamofire? 【发布时间】:2017-04-21 10:29:59 【问题描述】:

我正在使用 Swift 3。直到现在我还没有真正使用过 JSON。我正面临这个问题,我只能在 query 之前解析数据。之后没有数据被解析。请帮助我知道我在这里做错了什么。

JSON 代码:


  "batchcomplete": "",
  "continue": 
    "gpsoffset": 10,
    "continue": "gpsoffset||"
  ,
  "query": 
    "pages": 
      "445066": 
        "pageid": 445066,
        "ns": 0,
        "title": "RoboCop",
        "index": 3,
        "thumbnail": 
          "source": "https://upload.wikimedia.org/wikipedia/en/thumb/1/16/RoboCop_%281987%29_theatrical_poster.jpg/32px-RoboCop_%281987%29_theatrical_poster.jpg",
          "width": 32,
          "height": 50
        
      ,
      "25781": 
        "pageid": 25781,
        "ns": 0,
        "title": "Robot",
        "index": 1,
        "thumbnail": 
          "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/05/HONDA_ASIMO.jpg/37px-HONDA_ASIMO.jpg",
          "width": 37,
          "height": 50
        
      ,
      "2629669": 
        "pageid": 2629669,
        "ns": 0,
        "title": "Robot-assisted surgery",
        "index": 8,
        "thumbnail": 
          "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/0/0d/Laproscopic_Surgery_Robot.jpg/34px-Laproscopic_Surgery_Robot.jpg",
          "width": 34,
          "height": 50
        
      ,
      "1527386": 
        "pageid": 1527386,
        "ns": 0,
        "title": "Robot Chicken",
        "index": 9
      ,
      "364093": 
        "pageid": 364093,
        "ns": 0,
        "title": "Robot Wars (TV series)",
        "index": 2
      ,
      "3977472": 
        "pageid": 3977472,
        "ns": 0,
        "title": "Robot competition",
        "index": 10
      ,
      "26333": 
        "pageid": 26333,
        "ns": 0,
        "title": "Robotech",
        "index": 5,
        "thumbnail": 
          "source": "https://upload.wikimedia.org/wikipedia/en/thumb/9/99/RobotechTitle1985.jpg/50px-RobotechTitle1985.jpg",
          "width": 50,
          "height": 38
        
      ,
      "20903754": 
        "pageid": 20903754,
        "ns": 0,
        "title": "Robotics",
        "index": 4,
        "thumbnail": 
          "source": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c5/Shadow_Hand_Bulb_large.jpg/33px-Shadow_Hand_Bulb_large.jpg",
          "width": 33,
          "height": 50
        
      ,
      "893808": 
        "pageid": 893808,
        "ns": 0,
        "title": "Robots (2005 film)",
        "index": 7
      ,
      "101673": 
        "pageid": 101673,
        "ns": 0,
        "title": "Robots exclusion standard",
        "index": 6
      
    
  

Swift 代码:

 var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options:.mutableContainers) as? JSONStandard
        print(readableJSON)
            if let query = readableJSON?["query"] as? JSONStandard

                print(query," Here!! ")

                if let pages = readableJSON?["pages"] as? [JSONStandard]

                    print(pages," Check this! ")


                    for i in 0..<pages.count

                        let page = pages[i]

                        let id = page ["id"] as! String

                        //titles.append(id)

                        self.tableView.reloadData()

                    
                
            

正如您在块 pages 中看到的那样,每个新块的声明都没有任何标识符,那么如何调用该特定块?

【问题讨论】:

您可以使用 swift 本机方法进行 json 解析,而无需使用 alarmofire @Balvansh Heerekar 您的代码有什么问题?错误是什么?似乎您在“查询”中有“页面”,但您解析错误。 您可以获得页面的所有键,然后您可以使用键值对访问每个块 @TusharSharma 我的代码问题是在query 之后我无法访问任何内容。是的,pages 存在于query 中。你能帮我解析一下吗? @Balvansh Heerekar 解决方案由 vadian 提供。 【参考方案1】:

pages 的值是字典,而不是数组,它派生自 query

请阅读 JSON:[] 是数组 是字典。

没有键id,它是pageid,值是Int(没有双引号)。

         if let pages = query["pages"] as? JSONStandard 
                print(pages," Check this! ")
                for (_, page) in pages 
                    let id = page ["pageid"] as! Int
                    print(id)
                    titles.append("\(id)")
                
                self.tableView.reloadData() // don't reload the table view in the loop.
            

或者——更简单——取字典的键,这也是id 数字(这里确实是String

         if let pages = query["pages"] as? JSONStandard 
                print(pages," Check this! ")
                for (id, page) in pages 
                    print(id)
                    titles.append(id)
                
                self.tableView.reloadData()
            

请注意,字典始终是无序的。

【讨论】:

只是怀疑是不是应该像 let pages = query ["pages"] as 一样? JSON标准

以上是关于如何使用 Alamofire 在 Swift 3 中解析 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Alamofire 在 Swift 3 中解析 JSON?

Alamofire 4 请求返回 NSArray,无法弄清楚如何在 Swift 3 中使用 SwiftyJSON 进行解析

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

如何使用 Alamofire 在 Xcode 8 Swift 3.0 中获取特定的 JSON?

如何使用 Alamofire 5.0.0-beta.3 (Swift 5) 上传图片(多部分)

如何在 Alamofire 请求 swift 3 上发出警报