Asif mimi
Asif mimi

Reputation: 113

How to parse nested JSON array in TableView Swift?

I am using an endpoint that returns a JSON as response. The problem is response json is a huge data to process for me. From that I want to show all the Surah(englishName) name to display in the tableview. I tried my best as a new bee to iOS development. Please take a look at my snippet and let me know where i am doing wrong.

my Json data here:

ViewController code:

var surahName = [Surah]()

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
    super.viewDidLoad()
}


//MARK: JSON parse
func parseJSON()  {
    let url = URL(string: "https://api.alquran.cloud/v1/quran/ar.alafasy")
    
    guard url != nil else{
        print("URL Founr Nill")
        return
    }
    
    URLSession.shared.dataTask(with: url!) { (data, response, error) in
        if error == nil && data != nil{
            do{
                self.surahName = try JSONDecoder().decode([Surah].self, from: data!)

                DispatchQueue.main.async {
                    self.tableView.reloadData()
                }
            }catch{
                print(error)
            }
        }
    }.resume()
}

//MARK: Tableview delegate
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return surahName.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell:QuranAudioCell = tableView.dequeueReusableCell(withIdentifier: "cell") as! QuranAudioCell
    let arrdata = surahName[indexPath.section].data.surahs
    cell.nameLbl.text = arrdata[indexPath.row].englishName
    return cell
}

Problem is its not printing anything in the tablview.

Upvotes: 0

Views: 351

Answers (1)

Kazi Abdullah Al Mamun
Kazi Abdullah Al Mamun

Reputation: 1481

Change first line as

var surahNames = [EnglishName]()

Inside do-catch block change

self.surahName = try JSONDecoder().decode([Surah].self, from: data!)

into

let response = try JSONDecoder().decode(Surah.self, from: data!)
self.surahName = response.data.surahs

Now inside cellForRowAtIndexPath do this

let surah = surahName[indexPath.row]
cell.nameLbl.text = surah.englishName

Upvotes: 1

Related Questions