swift3.0json數(shù)據(jù)解析

最近在學(xué)習(xí)swift蛾方,也是按照別人的代碼敲打的水平,雖然時間不長袭厂,但是還是深刻的感覺到swift結(jié)構(gòu)體和枚舉的強(qiáng)大剑刑,下面是本人從別人代碼里看到的一段關(guān)于json解析的封裝媳纬,感覺非常不錯所以想和大家分享分享,也借此來記錄我學(xué)習(xí)的腳步施掏。
在沒有看到這段代碼之前层宫,我是用一個簡單的方法進(jìn)行解析,數(shù)據(jù)返回的形式是Any其监,我是強(qiáng)制性轉(zhuǎn)化為AnyObject返回給調(diào)用者

let object: Any = try JSONSerialization.jsonObject(with: data, options: opt)

沒有對數(shù)據(jù)類型進(jìn)行任何判斷萌腿,因為一般數(shù)據(jù)解析,我們都是可以提前看到數(shù)據(jù)類型的抖苦,也沒有必要在這進(jìn)行太多的判斷毁菱,我是這樣僥幸的想的米死。

偶爾看到了這段代碼,所以也想和大家分享一下

1.定義了一個枚舉類表示數(shù)據(jù)類型

public enum Type :Int{
    case number
    case string
    case bool
    case array
    case dictionary
    case null
    case unknown
}

2.然后定義了一個JSON結(jié)構(gòu)體來做這件事


public struct JSON {

    
    public init(data:Data, options opt: JSONSerialization.ReadingOptions = .allowFragments, error: NSErrorPointer? = nil) {
        do {
            let object: Any = try JSONSerialization.jsonObject(with: data, options: opt)
            self.init(object as AnyObject)
            
        } catch let aError as NSError {
            if error != nil {
                error??.pointee = aError
            }
            self.init(NSNull())
        }
    }
    
    public init(_ object: AnyObject) {
        self.object = object
    }

    
    
    /// Private object
    fileprivate var rawArray: [AnyObject] = []
    fileprivate var rawDictionary: [String : AnyObject] = [:]
    fileprivate var rawString: String = ""
    fileprivate var rawNumber: NSNumber = 0
    fileprivate var rawNull: NSNull = NSNull()
    fileprivate var _type: Type = .null
    fileprivate var _error: NSError? = nil
    
    var object : AnyObject{
   
        get
        {
            switch self._type {
            case .array:
                return self.rawArray as AnyObject
            case .dictionary:
                return self.rawDictionary as AnyObject
            case .string:
                return self.rawString as AnyObject
            case .number:
                return self.rawNumber as AnyObject
            case .bool:
                return self.rawNumber as AnyObject
            default:
                return self.rawNull
            }
            
        }set{
            _error = nil
            switch newValue {
                
            case let number as NSNumber:
                if number.boolValue {
                    
                    _type = .bool
                }else{
                    _type = .number
                }
                self.rawNumber = number
                
            case let string as String:
                _type = .string
                self.rawString = string
            case  _ as NSNull:
                _type = .null
            case let array as [AnyObject]:
                _type = .array
                self.rawArray = array
            case let dictionary as [String : AnyObject]:
               
                _type = .dictionary
                self.rawDictionary = dictionary
            default:
                _type = .unknown
                _error = NSError.init(domain: "SwiftyJSONErrorDomain", code: 999, userInfo: [NSLocalizedDescriptionKey: "It is a unsupported type"])
            }
            
        }
    
    }


}

整段代碼對數(shù)據(jù)類型判斷的很全面贮庞,雖然代碼量有點多峦筒,但是找不到方法去拒絕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窗慎,一起剝皮案震驚了整個濱河市物喷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遮斥,老刑警劉巖峦失,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異术吗,居然都是意外死亡尉辑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門较屿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隧魄,“玉大人,你說我怎么就攤上這事隘蝎」鹤模” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵嘱么,是天一觀的道長狮含。 經(jīng)常有香客問我,道長拱撵,這世上最難降的妖魔是什么辉川? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任表蝙,我火速辦了婚禮拴测,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘府蛇。我一直安慰自己集索,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布汇跨。 她就那樣靜靜地躺著务荆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪穷遂。 梳的紋絲不亂的頭發(fā)上函匕,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音蚪黑,去河邊找鬼盅惜。 笑死中剩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抒寂。 我是一名探鬼主播结啼,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼屈芜!你這毒婦竟也來了郊愧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤井佑,失蹤者是張志新(化名)和其女友劉穎属铁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體毅糟,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡红选,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了姆另。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喇肋。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖迹辐,靈堂內(nèi)的尸體忽然破棺而出蝶防,到底是詐尸還是另有隱情,我是刑警寧澤明吩,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布间学,位于F島的核電站,受9級特大地震影響印荔,放射性物質(zhì)發(fā)生泄漏低葫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一仍律、第九天 我趴在偏房一處隱蔽的房頂上張望嘿悬。 院中可真熱鬧,春花似錦水泉、人聲如沸善涨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钢拧。三九已至,卻和暖如春炕横,著一層夾襖步出監(jiān)牢的瞬間源内,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工份殿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留膜钓,地道東北人塔鳍。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像呻此,于是被迫代替她去往敵國和親轮纫。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫焚鲜、插件掌唾、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,094評論 4 62
  • 這段時間趁閑魚時間,看到一段關(guān)于JAVA爬蟲某知名網(wǎng)站的代碼忿磅;試了試ios利用webview 及 AFNETWOR...
    一支煙一只猿閱讀 3,294評論 4 11
  • 太伯沒有繼承太王的王位糯彬,而是讓與了他的弟弟季歷,因為季歷有個兒子叫姬昌葱她。其實太王是想傳位給姬昌撩扒,但周禮是父死子繼,...
    此心如水只東流閱讀 488評論 0 1
  • 早:300ml黃豆小麥胚芽藕粉吨些、6核桃搓谆、1茶蛋 午:蔬菜雜燴、家常餅(泻朗) 晚:1三元無糖酸奶泉手、4蜜桔、6圣女果
    春天和海燕閱讀 241評論 0 0
  • 2016偶器,一個有這2月29號的年份斩萌,在這一天男孩和女孩相遇了... “好!tfboys的彩排先到這里屏轰!” 導(dǎo)演喊了...
    眼鏡小姐閱讀 554評論 6 3