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

时间:2017-04-21 10:29:59

标签: ios json swift xcode wikimedia

我正在使用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中看到的那样,每个新块都声明没有任何标识符,那么如何调用该特定块?

1 个答案:

答案 0 :(得分:2)

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

请注意字典总是无序的。