描述: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é)果
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┮!奴迅!