1. 程式人生 > >swift 網路請求&json解析

swift 網路請求&json解析

做實際專案總是離不開這兩步,大多數情況下都是採用第三方框架來輔助完成,swift也不例外,由於swift並不成熟,用swift語言寫的第三方框架很不穩定(蘋果更新太快了),所幸swift和oc可以混編,所以本次使用的框架都是oc裡面常用的。網路請求使用AFNetworking,json解析使用MJExtension。
下面開始正文:

1. swift中使用oc框架

其原理很簡單,需要一個.h標頭檔案,裡面匯入我們需要使用的oc框架的標頭檔案,把這個.h檔案配置到專案設定中即可

1).我們採取一個不容易出錯的方法來建立.h檔案,在swift專案中新建oc類

這裡寫圖片描述

注意語言選擇oc語言,建立完後,xcode會有這麼一個提示

這裡寫圖片描述

詢問是否建立一個橋街頭,這波很關鍵,點建立
這裡寫圖片描述

如圖,建立完後在專案設定那裡會有配置這個檔案的,如果自己建立自己配置,很容易把路徑寫錯~
接下來測試一下我們是否配置正確
在前面建立的test類中寫一個方法,並且在swift中呼叫

這裡寫圖片描述

這裡寫圖片描述

在上面的橋街標頭檔案中匯入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)
        })

如此便能解析到所有的資料~

打個斷點,可以看到更多資料哦
這裡寫圖片描述

完~