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

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

问题描述:

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

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每个新块不带任何标识声明看,所以我怎么叫那个特别的区块?

+0

你可以使用swift原生方法并且不使用alarmofire来做json pasing –

+0

@Balvansh Heerekar你的代码有什么问题?什么是错误?似乎你在“查询”中有“页面”,你解析它是错误的。 –

+0

你可以得到所有页面的密钥,然后你可以使用密钥值对访问每个块 –

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() 
      } 

要知道,字典始终是无序的。

+0

只是怀疑是不是应该像let pages = query [“pages”]那样? JSONStandard –

+0

@TusharSharma对,当然,谢谢。 – vadian

+0

随时欢迎。 –