swift 网络请求&json解析

作实际项目老是离不开这两步,大多数状况下都是采用第三方框架来辅助完成,swift也不例外,因为swift并不成熟,用swift语言写的第三方框架很不稳定(苹果更新太快了),所幸swift和oc能够混编,因此本次使用的框架都是oc里面经常使用的。网络请求使用AFNetworking,json解析使用MJExtension。
下面开始正文:javascript

1. swift中使用oc框架java

其原理很简单,须要一个.h头文件,里面导入咱们须要使用的oc框架的头文件,把这个.h文件配置到项目设置中便可json

1).咱们采起一个不容易出错的方法来建立.h文件,在swift项目中新建oc类swift

这里写图片描述

注意语言选择oc语言,建立完后,xcode会有这么一个提示api

这里写图片描述

询问是否建立一个桥街头,这波很关键,点建立
这里写图片描述xcode

如图,建立完后在项目设置那里会有配置这个文件的,若是本身建立本身配置,很容易把路径写错~
接下来测试一下咱们是否配置正确
在前面建立的test类中写一个方法,而且在swift中调用markdown

这里写图片描述

这里写图片描述

在上面的桥街头文件中导入test.h (很关键!)
这里写图片描述网络

在swift中调用测试
这里写图片描述框架

通常会高亮而且能自动提示就没啥子问题了、测试

2. 引入第三方框架并调用

这里就很简单了,直接把代码拷贝进来,导入头文件就好了

这里写图片描述

而且在桥街头文件中导入框架包

#import "AFNetworking.h"
#import "MJExtension.h"

至于框架的使用方法,我就再也不赘述,官方文档写的很清楚了、

let manager = AFHTTPSessionManager()
        let url = "http://op.juhe.cn/onebox/weather/query?cityname=%e6%b7%b1%e5%9c%b3&key=eb08f814be6e473ec5ad9a6bde57e5e5&dtype=json"

        manager.GET(url, parameters: nil, success: { ( datatask :NSURLSessionDataTask, object :AnyObject?) in
            NSLog("请求成功")            
        },failure: { (datask, object) in
            NSLog("请求失败%@",object)
        })

还有一个要注意的,在高版本的xcode中,不容许使用http请求(只容许HTTPS),须要在项目的plist文件中加入这么一段

<key>NSAppTransportSecurity</key><dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/></dict>

测试一下,若是上述配置正确的话,是可以打印请求成功的~

3.请求成功后的数据解析
看回调方法上,object就是返回的数据,可是他是一个anyobject类型,就至关于oc里面的id类型(任意类型),实测返回的是一个字典类型,假若你想打印出来,须要先强转成字典(oc里面能够直接打印)

let dict : NSDictionary = object as! NSDictionary
            NSLog("%@", dict)

框架已经帮咱们转成字典类型了,如今要作的就是字典转模型了

4.复杂json解析&模型的写法

上面咱们已经取到了字典了,其实已经能够利用系统的方法来字典转模型,可是对于比较复杂的json数据,系统的方法仍是须要让咱们写不少的代码~
此次用来测试的json数据是天气预报的,放出接口文档,上面有返回的json示例,若是你把上面的字典打印出来了,你也将看到大体结构

模型类

class WeatherBean: NSObject {

    var reason : String!
    var error_code : NSNumber!
    var result : Result!


    class Result: NSObject {
        var data:Data!
    }

    class Data: NSObject {
        var realtime:Realtime!
        var life:Life!
        var weather:Array<Weather2>!
        var pm25:Pm25!
        var date : String!
        var isForeign : NSNumber!

    }

    class Realtime: NSObject {
        var city_code:String!
        var city_name:String!
        var date:String!
        var time:String!
        var week:NSNumber!
        var moon:String!
        var dataUptime:NSNumber!
        var weather:Weather!
        var wind:Wind!

    }

    class Weather: NSObject {
        var temperature:String!
        var humidity:String!
        var info:String!
        var img:String!
    }

    class Wind: NSObject {
        var direct:String!
        var power:String!
        var offset:String!
        var windspeed:String!
    }

    class Life: NSObject {
        var data:String!
        var info:Info!
    }
    class Info: NSObject {
        var chuanyi:Array<String>!
        var ganmao:Array<String>!
        var kongtiao:Array<String>!
        var wuran:Array<String>!
        var xiche:Array<String>!
        var yundong:Array<String>!
        var ziwaixian:Array<String>!
    }

    class Weather2: NSObject {
        var date:String!
        var info:Info2!
        var week:String!
        var nongli:String!

        class Info2: NSObject {
            var day:Array<String>!
            var night:Array<String>!
        }

    }

    class Pm25: NSObject {

        var show_desc:String!
        var pm25:Pm252!
        var dateTime:String!
        var key:String!
        var cityName:String!

        class Pm252: NSObject {
            var pm25:String!
            var curPm:String!
            var pm10:String!
            var level:String!
            var quality:String!
            var des:String!

        }


    }


}

最深大概4-5层,算的上是很复杂的了~

Java的小伙伴必定都用过gson,其实mj解析和这个很是像,模型类的写法都一致

manager.GET(url, parameters: nil, success: { ( datatask :NSURLSessionDataTask, object :AnyObject?) in

            let weat = WeatherBean.mj_objectWithKeyValues(object)
            NSLog("请求成功"+weat.reason+weat.result.data.pm25.cityName)


        },failure: { (datask, object) in
            NSLog("请求失败%@",object)
        })

如此便能解析到全部的数据~

打个断点,能够看到更多数据哦
这里写图片描述

完~

相关文章
相关标签/搜索