Search code examples
jsonswiftxcodealamofireswifty-json

Parse JSON from GoogleApiBooks


I'm trying to parse this JSON but it don't works.

This is the JSON:

{
  "kind": "books#volumes",
  "totalItems": 1,
  "items": [
    {
      "kind": "books#volume",
      "id": "uCHmPQAACAAJ",
      "etag": "aBZ3KnoRsq4",
      "selfLink": "https://www.googleapis.com/books/v1/volumes/uCHmPQAACAAJ",
      "volumeInfo": {
        "title": "Psicologia delle folle",
        "authors": [
          "Gustave Le Bon"
        ],
        "publishedDate": "2004",
        "industryIdentifiers": [
          {
            "type": "ISBN_10",
            "identifier": "8850206240"
          },
          {
            "type": "ISBN_13",
            "identifier": "9788850206247"
          }
        ],
        "readingModes": {
          "text": false,
          "image": false
        },
        "pageCount": 251,
        "printType": "BOOK",
        "categories": [
          "Psychology"
        ],
        "maturityRating": "NOT_MATURE",
        "allowAnonLogging": false,
        "contentVersion": "preview-1.0.0",
        "language": "it",
      },
      "saleInfo": {
        "country": "IT",
        "saleability": "NOT_FOR_SALE",
        "isEbook": false
      },
      "accessInfo": {
        "country": "IT",
        "viewability": "NO_PAGES",
        "embeddable": false,
        "publicDomain": false,
        "textToSpeechPermission": "ALLOWED",
        "epub": {
          "isAvailable": false
        },
        "pdf": {
          "isAvailable": false
        },
        ,
        "accessViewStatus": "NONE",
        "quoteSharingAllowed": false
      }
    }
  ]
}

And this is the code that i'm using:

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    var url = "https://www.googleapis.com/books/v1/volumes?q=isbn9788850206247&key=my-key"


    Alamofire.request(url).responseJSON { (responseData) -> Void in
        if((responseData.result.value) != nil) {
            let swiftyJsonVar = JSON(responseData.result.value!)

            if let resData = swiftyJsonVar["items"].arrayObject {
                self.arrRes = resData as! [[String:AnyObject]]
                print(self.arrRes)
            }
            if self.arrRes.count > 0 {
                self.tableProva.reloadData()
            }
        }
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableProva.dequeueReusableCell(withIdentifier: "cellProva", for: indexPath) as! CellProvaClass
    var dict = arrRes[indexPath.row]
    cell.titleLabel?.text = dict["title"] as? String
    cell.authorLabel?.text = dict["authors"] as? String
    return cell
}

How can I solve this problem?


Solution

  • This is your JSON Reponse ( in short format) :

    enter image description here

    And this is the data structure (Array and dictionary format) : enter image description here

    Now you have to access : title and authors so here is your value in cellforRowAtIndexPath Method , a dictionary having name dict stores values of volumeInfo ( a Dictionary) :

    so you have to use this way to access title :

    cell.titleLabel?.text = dict["volumeInfo"]["title"] as? String
    
    //To Fetch Author array
      if let authorArray = dict["volumeInfo"]["authors"] as? NSArray{
              print(authorArray)
       }
    

    and then to access author is an array so which index of value you want to show in cell.authorLabel .

    In Second Screenshot those which are enclosed with {} is Dictionary and [] is Array

    First try to show Title and then same way try to fetch value of author array and set according to your requirement.

    Feel Free to comment if any further issue.