2016-12-10 2 views
0

Я пытаюсь разобрать этот JSON, но он не работает.Parse JSON от GoogleApiBooks

Это 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 
     } 
    } 
    ] 
} 

И это код, который я использую:

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 
} 

Как я могу решить эту проблему?

+0

проверить мой ответ –

ответ

0

Это ваш JSON réponse (в сокращенном формате):

enter image description here

И это структура данных (Array и словарь формат): enter image description here

Теперь у вас есть доступ к: title и authors, так вот ваше значение в методе cellforRowAtIndexPath, словарь с именем dict хранит значения volumeInfo (a Dictionary):

так что вы должны использовать этот способ доступа название:

cell.titleLabel?.text = dict["volumeInfo"]["title"] as? String 

//To Fetch Author array 
    if let authorArray = dict["volumeInfo"]["authors"] as? NSArray{ 
      print(authorArray) 
    } 

, а затем получить доступ к автору массив так, какой индекс ценности вы хотите показать в cell.authorLabel.

В Second Screenshot те, которые заключены с {} is Dictionary and [] is Array

первой попытки, чтобы показать название и затем таким же образом пытаются извлечь значение автора массива и установить в соответствии с вашими требованиями.

Не стесняйтесь, прокомментируйте, если возникнет проблема.

+0

Как я могу взять «авторов»? – DanieleLanari

+0

@ DanieleLanari обновленный код, чтобы показать массив авторов –

+0

спасибо, я ценю это @ShobhakarTiwari – DanieleLanari

0

При разборе JSON на линии

if let resData = swiftyJsonVar["items"].arrayObject {

вы получите объект NSDictionary, который содержит все другие вложенные элементы & массивы в ключах. В вашем делегате tableView вы напрямую обращаетесь к значению из arrRes, распаковывая его в объект NSDictionary. Все записи доступны в массиве с именем items, который дополнительно имеет вложенный объект volumeInfo, который содержит информацию об заголовке & еще один массив из Authors.

Вам необходимо извлечь дополнительные вложенные объекты из объекта arrRes, чтобы использовать его в функции делегата tableView cellForRowAtIndex.

Дайте мне знать, если вам нужна дополнительная помощь.

+0

Я понимаю, в чем проблема. Как получить «название» и «автор» из «volumeInfo»? Я все еще неопытен в отношении использования json – DanieleLanari