首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift中解码JSON

在Swift中解码JSON
EN

Stack Overflow用户
提问于 2017-09-07 01:59:34
回答 1查看 98关注 0票数 1

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

下面是我解码它的方式:

代码语言:javascript
复制
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()
}

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

代码语言:javascript
复制
    {
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。

EN

回答 1

Stack Overflow用户

发布于 2017-09-07 02:13:00

请按照以下步骤操作:

  1. 创建一个名为APIManager

的类

  1. 创建委托方法,如下所示

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

apiManagerDelegate代理:NSObjectProtocol{ func apiSuccessResponse(_ response: Dictionary) func APIFailureResponse(_ msgError: String) }

//MARK :自定义扩展方法

代码语言:javascript
复制
extension apiManagerDelegate {
    func apiSuccessResponse(_ response: Dictionary<String, AnyObject>){
        // leaving this empty
    }
    func APIFailureResponse(_ msgError: String){
        // leaving this empty
    } }

  1. 在您的视图控制器中,符合此委托方法。
  2. 定义了这样的方法来使用API管理器

中的web服务

func signUpAPI(firstName : String,姓氏:String,邮箱:String,密码:String,确认age:String,手机:String,年龄:String,性别:String,signUp_type:Int) {

代码语言:javascript
复制
        //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. 上面的方法解析数据,并将其发送到success或failure方法,然后将其发送到视图控制器,然后您需要填充数据并呈现它。

这不是很简单吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46081608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档