SwiftyJSON的使用方法

描述:SwiftyJSON是一個(gè)swift編寫的對(duì)json數(shù)據(jù)進(jìn)行解析的類庫蕊苗,SwiftyJSON的使用極其方便覆履,而且不用擔(dān)心數(shù)組越界等問題

GitHub地址:https://github.com/SwiftyJSON/SwiftyJSON

在本文寫作時(shí)凤瘦,SwiftyJSON在GitHub上的star已經(jīng)達(dá)到了14899着憨,光看star就知道柄瑰,這個(gè)庫落竹,還是比較值得用的泌霍。

1.cocoapods導(dǎo)入并安裝

pod "SwiftyJSON" 

2.在使用的文件中導(dǎo)入頭文件

import SwiftyJSON

3.獲取要解析的數(shù)據(jù)(此時(shí)為寫死的假數(shù)據(jù),實(shí)際使用的應(yīng)該是通過API獲取的數(shù)據(jù)或者其他途徑獲取的數(shù)據(jù)述召,此數(shù)據(jù)的結(jié)構(gòu)為真實(shí)項(xiàng)目的數(shù)據(jù)結(jié)構(gòu)朱转,所以,解析方式也會(huì)以該項(xiàng)目的后續(xù)解析方式進(jìn)行解析积暖,基本能滿足一般的項(xiàng)目的數(shù)據(jù)解析需求)

var jsonData: [String: Any] = [:]
jsonData["code"] = 200
jsonData["result"] = true
jsonData["message"] = "數(shù)據(jù)加載成功"
jsonData["data"] = [["id"           : "資訊1_id",
                     "title"        : "資訊1_標(biāo)題",
                     "pictrueUrl"   : "資訊1_圖片",
                     "description"  : "資訊1_描述",
                     "categoryTitle": "資訊1_分類標(biāo)題",
                     "tagArray"     : [["id":"yyy0bb1d82beb084718bbd88d45c39710d8","title":".net1"],
                                       ["id":"eee0bb1d82beb084718bbd88d45c39710d8","title":".net1"]],
                     "shareNumber"  : 1,
                     "clickNumber"  : 1],
                            
                     ["id"           : "資訊2_id",
                      "title"        : "資訊2_標(biāo)題",
                      "pictrueUrl"   : "資訊2_圖片",
                      "description"  : "資訊2_描述",
                      "categoryTitle": "資訊2_分類標(biāo)題",
                      "tagArray"     : [["id":"yyy0bb1d82beb084718bbd88d45c39710d8","title":".net2"],
                                        ["id":"eee0bb1d82beb084718bbd88d45c39710d8","title":".net2"]],
                      "shareNumber"  : 2,
                      "clickNumber"  : 2]]

4.創(chuàng)建JSON對(duì)象

let jsonObj = JSON.init(jsonData)

5.先判斷code與result


if jsonObj["result"].boolValue == false {
    print("獲取失敗")
    return
}
if jsonObj["code"].intValue != 200 {
/// 此處應(yīng)該是根據(jù)服務(wù)器返回的code值進(jìn)行判斷然后進(jìn)行后續(xù)操作藤为,現(xiàn)在只是簡(jiǎn)單的打印服務(wù)器返回的message
    print(jsonObj["message"].stringValue)
    return
}

6.解析數(shù)據(jù)主體,暫時(shí)將解析的數(shù)據(jù)均打印出來夺刑,實(shí)際使用中會(huì)對(duì)數(shù)據(jù)進(jìn)行其他操作

for dic in jsonObj["data"].arrayValue {
    print("id: ", dic["id"].stringValue)
    print("title: ", dic["title"].stringValue)
    print("pictrueUrl: ", dic["pictrueUrl"].stringValue)
    print("description: ", dic["description"].stringValue)
    print("categoryTitle: ", dic["categoryTitle"].stringValue)
    print("shareNumber: ", dic["shareNumber"].intValue)
    print("clickNumber: ", dic["clickNumber"].intValue)
            
    print("tagArray: ", dic["tagArray1"].arrayValue)
    for arr in dic["tagArray"].arrayValue {
        print("\t\ttagid: ", arr["id2"].stringValue)
        print("\t\ttitle: ", arr["title"].stringValue)
    }
}

7.打印的結(jié)果


打印結(jié)果

8.總結(jié)
SwiftyJSON的使用很簡(jiǎn)單
首先根據(jù)要解析的數(shù)據(jù)進(jìn)行創(chuàng)建對(duì)象缅疟,然后解析數(shù)據(jù)

創(chuàng)建JSON對(duì)象的方式有很多,如下

/**
    方法一: 使用data數(shù)據(jù)創(chuàng)建一個(gè)JSON對(duì)象

     - parameter data:  用來解析的數(shù)據(jù)遍愿,data類型
     - parameter opt:   JSON解析的選項(xiàng). 默認(rèn)`.AllowFragments`.
     - parameter error: 用來返回錯(cuò)誤的NSErrorPointer. 默認(rèn)為`nil`.
     - returns: 創(chuàng)建的JSON對(duì)象
     */
    public init(data:Data, options opt: JSONSerialization.ReadingOptions = .allowFragments, error: NSErrorPointer = nil)

    /**
     方法二:使用json字符串創(chuàng)建一個(gè)JSON對(duì)象

     - parameter string: 一個(gè)正常的json字符串存淫,例如 '{"a":"b"}'
     - returns: 創(chuàng)建的JSON對(duì)象
     */
    public static func parse(_ string:String) -> JSON

    /**
     方法三:使用一個(gè)對(duì)象創(chuàng)建一個(gè)JSON對(duì)象

     - parameter object:  這個(gè)對(duì)象必須有以下特性: 所有的對(duì)象是 NSString/String, NSNumber/Int/Float/Double/Bool, NSArray/Array, NSDictionary/Dictionary, 或 NSNull; 所有的字典的鍵是 NSStrings/String; NSNumbers 不允許是 NaN 或者 infinity.
     - returns: 創(chuàng)建的JSON對(duì)象
     */
    public init(_ object: Any)

    /**
     方法四:用一個(gè)JSON對(duì)象的數(shù)組創(chuàng)建一個(gè)JSON對(duì)象

     - parameter jsonArray: 一個(gè)Swift數(shù)組,數(shù)組的元素為JSON對(duì)象

     - returns: 創(chuàng)建的JSON對(duì)象
     */
    public init(_ jsonArray:[JSON])

    /**
     方法五:用一個(gè)值為JSON對(duì)象的字典創(chuàng)建一個(gè)JSON對(duì)象

     - parameter jsonDictionary: 一個(gè)Swif字典沼填,字典的值是JSON對(duì)象

     - returns: 創(chuàng)建的JSON對(duì)象
     */
    public init(_ jsonDictionary:[String: JSON])

解析的數(shù)據(jù)類型包括(除了URL與null桅咆,其余的每種數(shù)據(jù)類型都包括有可選值和默認(rèn)值,如果需要自定義默認(rèn)值坞笙,可以使用解析結(jié)果為可選的類型岩饼,如果不需要刽脖,可以直接使用默認(rèn)值,所有帶有默認(rèn)值的類型忌愚,都是在以Value為后綴曲管。例如,string獲取的就是可選的字符串硕糊,而stringValue獲取的就是帶有默認(rèn)值的字符串院水,非可選):

public var double: Double?
public var doubleValue: Double
public var float: Float?
public var floatValue: Float
public var int: Int?
public var intValue: Int
public var uInt: UInt?
public var uIntValue: UInt
public var int8: Int8?
public var int8Value: Int8
public var uInt8: UInt8?
public var uInt8Value: UInt8
public var int16: Int16?
public var int16Value: Int16
public var uInt16: UInt16?
public var uInt16Value: UInt16
public var int32: Int32?
public var int32Value: Int32
public var uInt32: UInt32?
public var uInt32Value: UInt32
public var int64: Int64?
public var int64Value: Int64
public var uInt64: UInt64?
public var uInt64Value: UInt64

public var URL: URL?

public var null: NSNull?

public var numberValue: NSNumber
public var number: NSNumber?

public var stringValue: String
public var string: String?

public var boolValue: Bool
public var bool: Bool?

public var dictionaryObject: [String : Any]?
public var dictionaryValue: [String : JSON]
public var dictionary: [String : JSON]?

public var arrayObject: [Any]?
public var arrayValue: [JSON]
public var array: [JSON]?

結(jié)束:
在文章的結(jié)束,放上一段我練習(xí)用的代碼简十,基本就是把上面的步驟結(jié)合在一起


import UIKit
import SwiftyJSON

class SwiftyJSONViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.white
        title = "SwiftyJSON"
    }
    
    private var jsonData: [String: Any] = [:]
    
    @IBAction func prepareJsonData(_ sender: UIButton) {
        
        jsonData["code"] = 200
        jsonData["result"] = true
        jsonData["message"] = "數(shù)據(jù)加載成功"
        jsonData["data"] = [["id"           : "資訊1_id",
                             "title"        : "資訊1_標(biāo)題",
                             "pictrueUrl"   : "資訊1_圖片",
                             "description"  : "資訊1_描述",
                             "categoryTitle": "資訊1_分類標(biāo)題",
                             "tagArray"     : [["id":"yyy0bb1d82beb084718bbd88d45c39710d8","title":".net1"],
                                               ["id":"eee0bb1d82beb084718bbd88d45c39710d8","title":".net1"]],
                             "shareNumber"  : 1,
                             "clickNumber"  : 1],
                            
                            ["id"           : "資訊2_id",
                             "title"        : "資訊2_標(biāo)題",
                             "pictrueUrl"   : "資訊2_圖片",
                             "description"  : "資訊2_描述",
                             "categoryTitle": "資訊2_分類標(biāo)題",
                             "tagArray"     : [["id":"yyy0bb1d82beb084718bbd88d45c39710d8","title":".net2"],
                                               ["id":"eee0bb1d82beb084718bbd88d45c39710d8","title":".net2"]],
                             "shareNumber"  : 2,
                             "clickNumber"  : 2]]
    }
    
    
    @IBAction func analysisJsonData(_ sender: UIButton) {
        
        let jsonObj = JSON.init(jsonData)
        
        if jsonObj["result"].boolValue == false {
            print("獲取失敗")
            return
        }
        if jsonObj["code"].intValue != 200 {
            print(jsonObj["message"].stringValue)
            return
        }
        
        print(jsonObj["message"].stringValue)
        
        for dic in jsonObj["data"].arrayValue {
            print("id: ", dic["id"].stringValue)
            print("title: ", dic["title"].stringValue)
            print("pictrueUrl: ", dic["pictrueUrl"].stringValue)
            print("description: ", dic["description"].stringValue)
            print("categoryTitle: ", dic["categoryTitle"].stringValue)
            print("shareNumber: ", dic["shareNumber"].intValue)
            print("clickNumber: ", dic["clickNumber"].intValue)
            
            print("tagArray: ", dic["tagArray1"].arrayValue)
            for arr in dic["tagArray"].arrayValue {
                print("\t\ttagid: ", arr["id2"].stringValue)
                print("\t\ttitle: ", arr["title"].stringValue)
            }
        }
    }
}

各位檬某,別人為我們?cè)炝溯喿樱覀兛梢灾苯幽脕碛妹腔帜眨覀儾粦?yīng)該只是會(huì)拿來用,在自己不忙的時(shí)候胰默,研究一下別人寫的好代碼场斑,嘗試著寫一點(diǎn)自己的輪子,我相信牵署,那會(huì)比學(xué)會(huì)使用輪子更讓人興奮B┮!奴迅!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末青责,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子取具,更是在濱河造成了極大的恐慌脖隶,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暇检,死亡現(xiàn)場(chǎng)離奇詭異产阱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)占哟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門心墅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人榨乎,你說我怎么就攤上這事√笨穑” “怎么了蜜暑?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)策肝。 經(jīng)常有香客問我肛捍,道長(zhǎng)隐绵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任拙毫,我火速辦了婚禮依许,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缀蹄。我一直安慰自己峭跳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布缺前。 她就那樣靜靜地躺著蛀醉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衅码。 梳的紋絲不亂的頭發(fā)上拯刁,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音逝段,去河邊找鬼垛玻。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奶躯,可吹牛的內(nèi)容都是我干的夭谤。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼巫糙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼朗儒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起参淹,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤醉锄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后浙值,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恳不,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年开呐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烟勋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筐付,死狀恐怖卵惦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓦戚,我是刑警寧澤沮尿,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站较解,受9級(jí)特大地震影響畜疾,放射性物質(zhì)發(fā)生泄漏赴邻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一啡捶、第九天 我趴在偏房一處隱蔽的房頂上張望姥敛。 院中可真熱鬧,春花似錦瞎暑、人聲如沸彤敛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臊泌。三九已至,卻和暖如春揍拆,著一層夾襖步出監(jiān)牢的瞬間渠概,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工嫂拴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留播揪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓筒狠,卻偏偏與公主長(zhǎng)得像猪狈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辩恼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理雇庙,服務(wù)發(fā)現(xiàn),斷路器灶伊,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫疆前、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,101評(píng)論 4 62
  • 本文詳細(xì)講解了 Gitbook 生成電子書的完整過程聘萨,內(nèi)容包括:安裝竹椒、命令、配置米辐、文檔結(jié)構(gòu)胸完、生成電子書、部署翘贮。限于...
    靜默虛空閱讀 11,253評(píng)論 9 138
  • 基礎(chǔ)太差赊窥,從頭再來!從http到socket择膝。 http請(qǐng)求解析 請(qǐng)求報(bào)文分為三部分:請(qǐng)求行誓琼、請(qǐng)求頭、請(qǐng)求體 如圖...
    咸魚而已閱讀 543評(píng)論 0 0
  • 先有意義肴捉,再有條理腹侣!【51】 “反思”如何將想法轉(zhuǎn)化為行動(dòng),以及反思的3個(gè)問句齿穗。想法和雜事傲隶,是不可以被管理的,我們...
    朱進(jìn)偉西農(nóng)閱讀 787評(píng)論 0 2