Basu
Basu

Reputation: 763

Decoding JSON in Swift

I am fetching JSON data from my server. I am using Alamofire in my code to fetch data from server.

Here's how I am decoding it:

Alamofire.request(URL_GET_DATA, method: .post).responseJSON { response in
    //getting json
    if let json = response.result.value {
        print(json)

        let newsJson : NSArray = json as! NSArray
        self.parseData(data: ((newsJson[0] as AnyObject).value(forKey: "message") as? String)!)
    }
}

func parseData(data : String){
    //traversing through all elements of the array
    let newsArray: NSArray = data as! NSArray
    for i in 0..<newsArray.count{
        //adding hero values to the hero list
        self.newsList.append(Objectnews(
            id : (newsArray[i] as AnyObject).value(forKey: "id") as? String,
            heading: (newsArray[i] as AnyObject).value(forKey: "heading") as? String,
            description : (newsArray[i] as AnyObject).value(forKey: "description") as? String,
            time_stamp : (newsArray[i] as AnyObject).value(forKey: "time_stamp") as? String,
            type : (newsArray[i] as AnyObject).value(forKey: "type") as? String,
            imageurl: (newsArray[i] as AnyObject).value(forKey: "imageurl") as? String
        ))
    }

    print("reloading table")
    //displaying data in tableview
    self.tableView.reloadData()
}

Here's the log for same. It contains the response from server and the error it is throwing:

    {
error = 0;
message =     (
            {
        description = "September 5th marks Teacher\U2019s Day in India. It is celebrated on the birthday of our second President, Sarvepalli Radhakrishnan. It is a day when we pay respect to our teachers and appreciate their contribution to the society and our individual lives and plan special surprises, have a chance to thank them for their selfless work in making the leaders for tomorrow. N.S.S. unit celebrated Teacher's day by gifting a hand made card to each Teaching and Non-Teaching Staff of P.G.D.A.V. College. We will also like to put forward a special thanks to the creative department team of N.S.S. for their terrific job in making those beautiful hand made cards. Happy Teachers' Day to All!";
        heading = "Teacher's Day Celebration";
        id = 16;
        imageurl = "http://check.png";
        "time_stamp" = "05/09/2017 22:58";
        type = News;
    },
            {
        description = "Incessant rains and floods have brought a havoc in one of India's most populous state, Bihar due to which roads have been closed, houses destroyed and crores affected. Rahat - an initiative of Goonj NGO steps in such situations helping all those in need and this time NSS PGDAV is doing their share of help by donating Via GOONJ and is organising a Collection Drive for the flood survivors. Your donation will provide shelter, food and comfort to families. Below are some of the things you can donate to help the people:-\n\n-Tarpaulins\n-Old flex and ropes\n-Mosquito nets\n-Dry ration\n-Clothing\n-Good quality blankets \n-Wooden toiletries\n-Utensils \n-Bucket\n-Torch and batteries\n-Umbrella\n-Slippers\n-Candles\n-Solar lights etc\n\nGiving is not just about making a donation. It's about making a difference! So step forward and #DONATE.\n\nDate: 4th-9th September 2017.\nVenue- Lobby/Office Area.\nTime: 10AM-1PM.\n\nFor queries contact:\nEkta- 7503894368\nJhanvi- 7838401571";
        heading = "Collection Drive for Flood Affected Areas";
        id = 15;
        imageurl = "http://check.png";
        "time_stamp" = "02/09/2017 21:34";
        type = News;
    },
            {
        description = "\"Beauty isn't about having a pretty face, it is about having a pretty soul, a pretty heart and a pretty mind.\"\n\nN.S.S. P.G.D.A.V. is honoured and takes a great pride in telling that MS. LAXMI AGARWAL will be speaking at the orientation program of N.S.S. which is set to be held on 26th August from 12:00 P.M. onwards. Ms. Laxmi Agarwal has inspired this country by her courage and has been the recipient of International Women of Courage Award by Michelle Obama. She is an epitome of bravery.\n\nWe could not have been more proud and excited to have her encourage the students and motivate them to overcome barriers and achieve what they aim for. We are sure she will fill in positive vibes around the program and will inspire us all to do what we need to do, to achieve what we dream for, and to inspire others for the same.";
        heading = "NSS Orientation ";
        id = 14;
        imageurl = "http://check.png";
        "time_stamp" = "25/08/2017 16:47";
        type = News;
    },
            {
        description = "Welcome Fresher's,\nHere is the last step for final selection to become a member of N.S.S. Team.\nIt's the Personal Interview. So following is the list of students who have to appear on August 2, 2017\n\n\n\n\n\n\nDAY 1 - AUGUST 2, 2017\U00a0\nSLOT 1- 10:00 A.M. - 11:00 A.M.\n\n\nAmit\U00a0\nAditya Sapra\U00a0\nAman Gupta\U00a0\nAadesh Sachdeva\U00a0\nAkshay Gaba\U00a0\nAkansha Sharma\U00a0\nAnjali Kataria\U00a0\nAakash\U00a0\nAbhinav Kumar Malviya\U00a0\nAnkita Rai\U00a0\nAstha Kanojia\U00a0\nAnita Mandal\U00a0\nAnchal\U00a0\nArif\U00a0\nAaftab Ahmad\U00a0\nAshish\U00a0\nAashirya Mittal\U00a0\nAnshul Saini\U00a0\nAnanya Singh\U00a0\nAbhay Goyal\U00a0\nAnshu Kumari Gupta\U00a0\nAjay Kumar\U00a0\nAaftab\U00a0\nAnjali Bhatt\U00a0\nAditi Singh\U00a0\nAnirudh Ahlawat\U00a0\nAshutosh\U00a0\nAnuradha\U00a0\nAmiza\U00a0\nAsmat Khan\U00a0\nAyushi Chadha\U00a0\nAmbujakshi Bhardwaj\U00a0\nAnubhav jain\U00a0\nAshutosh Verma\U00a0\nAbhishek Anand\U00a0\nAbhiraj\U00a0\nAkansha\U00a0\nAbhishek ranjan\U00a0\nAyesha Chauhan\U00a0\nAkansha\U00a0\n\n\nSLOT 2 - 11:00 A.M. - 12:00 P.M.\n\n\nAnkit\U00a0\nAmar Jeet Verma\U00a0\nAnshika Adlakha\U00a0\nAnkur Verma\U00a0\nAnkita\U00a0\nAditya Raj Chaudhary\U00a0\nBhavay Virmani\U00a0\nBunty Kumar\U00a0\nBhawna\U00a0\nBronika Paul\U00a0\nBarkat Ali\U00a0\nBrahmadutt\U00a0\nBadal Sharma\U00a0\nBhavnish Sharma\U00a0\nChandra Prakash Bhambhu\U00a0\nChanchal\U00a0\nChetna Garg\U00a0\nChetan Verma\U00a0\nChirag Sethi\U00a0\nChetan\U00a0\nDeependra Pal Yadav\U00a0\nDivya Agnihotri\U00a0\nDeepak Sahni\U00a0\nDrishya Wahil\U00a0\nDiksha paut\U00a0\nDevendra Yadav\U00a0\nDivya Chabra\U00a0\nDeep Singh\U00a0\nDeepankar Vaid\U00a0\nDrishti Goyal\U00a0\nEkta Shankar\U00a0\nFarzan Iqram\U00a0\nGaurav Bhatt\U00a0\nGarima Behl\U00a0\nGaurav Saini\U00a0\nGarvish Nanda\U00a0\nGaurav Kumar\U00a0\nGarima Payla\U00a0\nGauri Dhamija\U00a0\nharshit Singh\U00a0\n\n\nSLOT 3 - 12:00 P.M. - 1:00 P.M.\n\n\U00a0\U00a0\nHimanshi Sharma\U00a0\nHarsh Gupta\U00a0\nHarshit Girdhar\U00a0\nHarsh Bansal\U00a0\nHarshita Chauhan\U00a0\nHeena\U00a0\nHeena\U00a0\nIrfan Khan\U00a0\nIshu Rai\U00a0\nJaspreet kaur\U00a0\nJyoti\U00a0\nJaisny\U00a0\nJyoti Nishad\U00a0\nKrishan Kumar\U00a0\nKrishna\U00a0\nKetu\U00a0\nKrishika Arora\U00a0\nKhushboo Yadav\U00a0\nKanan Makker\U00a0\nKriti Kapoor\U00a0\nKanika Yadav\U00a0\nKiran Pachori\U00a0\nKunal Nagar\U00a0\nKhushboo Bansal\U00a0\nKunal Sharma\U00a0\nKajal\U00a0\nLalit Mohan\U00a0\nLovely Mathur\U00a0\nMitali Baisoya\U00a0\nmanisha\U00a0\nMiti Dangwal\U00a0\nMukul Puri\U00a0\nMansingh\U00a0\nManoj Meena\U00a0\nMohammad faisal\U00a0\nM. Danish Ameer\U00a0\nMohit Jain\U00a0\nMantu Babu\U00a0";
        heading = "NSS Interview Day 1";
        id = 13;
        imageurl = "http://check.png";
        "time_stamp" = "01/08/2017 22:30";
        type = News;
    },
            {
        description = "Time and tide waits for none, we all learnt this proverb in our primary school but yesterday I experienced something contradictory to my learning. I saw the time stopping and taking a moment to absorb what was happening around? And guess what was it, it was you, the participants, the audience of Sevaarth whose overwhelming response took the event to a whole new level. You made the mighty time get adrenaline rush. \nThis year we brought in many technical advancement to our NSS unit. We launched our mobile app, website. We facilitated user with many problem solving features. We had more number of volunteers than previous year. Our reach set a new record in the history of all NSS Unit with a growth rate of more than 17,000%. As Sevaarth '17 ended in a great way, we are much more inspired by the work of every people who put their day and night in making sure you get what we have to offer. We are humbled by the response of people. \nWe owe a great deal to our sponsers - Little App, PaisaWapas, DCOP, DSB, Internsala, Nestle, SelfDrives.in, CareerLauncher, Student Stories, The Education Tree, DU Beat, Drama Cafe. Thank you to all.\nWe have a aim. We have people who craves great passion. And, these two thing is advancing us to a new level each and every day. Every day, NSS puts a positive value in this society. We are here to make a better world for each and every person out there. No matter what's your race, nationality, religion, we will make sure that you get what you deserve. In the coming years, NSS Unit of P.G.D.A.V College will get into different areas of society from education to better health care by acting as a bridge by them. \nSevaarth is an opportunity to showcase the talent of people who choose stay away from limelight in front of people. Sevaarth seemed to have touched its highest point with all the fun,  the immense hard work, representing our culture from a different perspective. \nWe promise to bring you a more vibrant version of Sevaarth next year. Adios! ";
        heading = "Thank you";
        id = 12;
        imageurl = "http://check.png";
        "time_stamp" = "22/01/2017 00:22";
        type = News;
    }
);
}
Could not cast value of type '__NSDictionaryI' (0x106456288) to 'NSArray' (0x106455e28).
(lldb) 

How can I properly decode it based on the error in the log? I am using Swift.

Upvotes: 1

Views: 147

Answers (1)

Shobhakar Tiwari
Shobhakar Tiwari

Reputation: 7892

Follow this step :

  1. Creat a class called APIManager

  2. Create Delegates method like this

    //MARK : Custom Protocol Methods protocol

apiManagerDelegate:NSObjectProtocol {
    
    func apiSuccessResponse(_ response: Dictionary<String, AnyObject>)
    func APIFailureResponse(_ msgError: String) 
}

//MARK : Custom Extension Methods

extension apiManagerDelegate {
    func apiSuccessResponse(_ response: Dictionary<String, AnyObject>){
        // leaving this empty
    }
    func APIFailureResponse(_ msgError: String){
        // leaving this empty
    } }
  1. In Your View Controller , Conforms this Delegate Methods .
  2. Defined method like this to consume web service in API Manager

func signUpAPI(firstName : String, lastName:String, email:String, password:String, confirmPwd:String, mobile:String, age:String, gender:String, signUp_type:Int) {

        //Payload Dict 
        let payloadDict = [
                            "first_name"    : firstName,
                            "last_name"     : lastName,
                            "email"         : email,
                            ....
                          ] as [String : Any]
        
        //Showing activity indicator
        ---progressbar goes here
        
        //Call Web API using Alamofire library
        AlamoFireSharedManagerInit()
        Alamofire.request(HCConstants.URL.HC_BASEURL + HCConstants.URL.SIGNUP, method: .post, parameters: payloadDict, encoding: JSONEncoding.default, headers: nil).responseJSON {  response in
            
            
            do
            {
                //Checking For Error
                if let error = response.result.error {
                    //Call failure delegate method
                    print(error)
                    //Stop AcitivityIndicator
                    self.hideHud()
                    self.delegate?.APIFailureResponse("Something goes wrong , Try after some time!!")
                    return
                }
                
                //Store Response
                let responseValue = try JSONSerialization.jsonObject(with: response.data!, options: JSONSerialization.ReadingOptions()) as! Dictionary<String, AnyObject>
                print(responseValue)
                //Check Success Flag
                print(responseValue["success"] as! Bool)
                if let mSuccessFlag = responseValue["success"] as? Bool {
                    //Failure message
                    if !mSuccessFlag {
                        self.delegate?.APIFailureResponse(responseValue["message"] as! String? ?? "Something goes wrong , Please try after some time")
                    }
                    //Call success delegate method
                    else {
                        self.delegate?.apiSuccessResponse(responseValue)
                    }
                }
                
                
                //Stop AcitivityIndicator
                self.hideHud()

            } catch {print("Sign up API fired exception")}
        }
    }
    
  1. Above method parse the data and send it to the success or failure method to your viewcontroller and from there you need to populate the data and just render it .

Isn't it super easy ?

Upvotes: 1

Related Questions