在Swift中解码JSON

时间:2017-09-06 17:59:34

标签: ios json swift

我从服务器获取JSON数据。我在我的代码中使用Alamofire从服务器获取数据。

以下是我如何解码它:

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

这里的日志是相同的。它包含来自服务器的响应及其抛出的错误:

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

如何根据日志中的错误正确解码?我正在使用Swift。

1 个答案:

答案 0 :(得分:1)

请按照以下步骤操作:

  1. 创建一个名为APIManager的课程
  2. 像这样创建委托方法

    // MARK:自定义协议方法协议

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

    // MARK:自定义扩展方法

    extension apiManagerDelegate {
        func apiSuccessResponse(_ response: Dictionary<String, AnyObject>){
            // leaving this empty
        }
        func APIFailureResponse(_ msgError: String){
            // leaving this empty
        } }
    
    1. 在View Controller中,符合此委派方法。
    2. 此类定义的方法在API Manager中使用Web服务
    3. 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. 上面的方法解析数据并将其发送到viewcontroller的成功或失败方法,然后你需要填充数据并进行渲染。
      2. 难道不容易吗?