iOS必须SwiftiOS Developer

Swift处理AFN返回的json数据

2016-12-16  本文已影响452人  laotoutou

参考原文: http://swiftcafe.io/2015/07/18/swift-json/

先抛开AFN不说,我们向服务器请求数据时,可以使用下面的方法:

        let addr = "http://api.budejie.com/api/api_open.php?a=list&c=data"
        let url = URL.init(string: addr)
        do {
            // jsonData为Data类型
            let jsonData = try Data.init(contentsOf: url!)
            // result为json类型
            let result = try JSONSerialization.jsonObject(with: jsonData!, options: .mutableContainers) as? NSDictionary
            // json有三种类型: 字典 数组 值
            // 字典转模型之前首先从json对象中得到字典
            let dict = result?["list"] as? NSArray
            print(dict!)
        } catch {
            print("出错啦")
        }

以上代码中的url返回的json有点大,贴出来太多,截取一部分说明一下:

{
    info =     {
        count = 2000;
        maxid = 1481784425;
        maxtime = 1481784425;
        page = 100;
        vendor = node94;
    };
    list =     (
                {
            bimageuri = "";
            bookmark = 128;
            "cache_version" = 2;
            cai = 60;
            "cdn_img" = "http://wimg.spriteapp.cn/ugc/2016/12/15/585216298ba9b_1.jpg";
            comment = 56;
            "create_time" = "2016-12-15 12:03:53";
            "created_at" = "2016-12-16 00:48:02";
            ding = 183;
            favourite = 128;
            hate = 60;
            height = 28870;
            id = 22634058;
            image0 = "http://wimg.spriteapp.cn/ugc/2016/12/15/585216298ba9b_1.jpg";
            image1 = "http://wimg.spriteapp.cn/ugc/2016/12/15/585216298ba9b_1.jpg";
            image2 = "http://wimg.spriteapp.cn/ugc/2016/12/15/585216298ba9b_1.jpg";
            t = 1481820482;
            tag = "";
            text = "\U54c7\U54c7\U54c7\Uff01\U798f\U5229\U6765\U4e86\Uff0c\U8001\U53f8\U673a\U5feb\U4e0a\U8f66\Uff01\U6ce2\U591a\U8001\U5e08\U9886\U885416\U540d\U5973\U4f18\U5171\U6f14\U5927\U611f\U8c22\U796d\Uff01";
            "theme_id" = 0;
            "theme_name" = "";
            "theme_type" = 0;
        }
     );
})

向一个后端地址发送get或post请求,服务器返回一个json格式的数据,(或者xml,本文为json),可以使用JSONSerialization类来将Data类型的数据转化为json对象:
let result = try JSONSerialization.jsonObject(with: jsonData!, options: .mutableContainers) as? NSDictionary
关于这个类的讲解可以看本文开头给出的链接。

JSON 数据分为三种形式,对象,数组,值。

如果我们的 JSON 根节点是以对象形式存放的,那么我们得到的就是一个 NSDictionary。而如果是以数组形式存放的,那么我们得到的就是一个 NSArray。

JSON中大括号括起来的是json对象,中括号括起来的是数组。

iOS开发中处理json数据一般是为了字典转模型,即NSDictionary转自定义Model,所以操作第一步是拿到json数据,之后将json转化为NSDictionary或者NSArray ,
然后的操作就是字典转模型了。

以AFN为例,地址还是上面给出的地址,返回的json也是一样的:

        let url = "http://api.budejie.com/api/api_open.php"
        var data = [String : String]()
        data["a"] = "list"
        data["c"] = "data"
        let af = AFHTTPSessionManager()
        af.get(url, parameters: data, progress: nil, success: { (_, jsonData) in
            let resultJson = jsonData as? NSDictionary // json对象
            let listArr = resultJson?["list"] as? NSArray // json数组
            let infoArr = resultJson?["info"] as? NSDictionary
        }, failure: { (_, error) in
            print(error)
        })

以上代码中AFN的get方法就已经是服务器返回的json数据了,然后根据这个json数据的格式判断转为NSDictionary还是NSArray ,转为cocoa的对象后,接下来的操作就容易了~

上一篇 下一篇

猜你喜欢

热点阅读