简体   繁体   中英

How to Parse JSON in Swift 3 using Alamofire?

I am working with Swift 3. I haven't actually used JSON until now. I am facing this issue where I can parse data only till query . No data is being parsed after that. Please help me know what I am doing wrong over here.

JSON Code :

{
  "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 Code:

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

                    }
                }
            }

And as you see in the block pages each new block is declared without any identifier, so how do I call that particular block?

The value for key pages is a dictionary, not an array and it derives from query .

Please read the JSON: [] is array {} is dictionary.

And there is no key id , it's pageid and the value is an Int (no double quotes).

         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.
            }

or – easier – take the key of the dictionary which is also the id number (here indeed as 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()
            }

Be aware that a dictionary is always unordered.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM