日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

HandyJSON和SwiftyJSON的应用

發布時間:2023/12/14 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HandyJSON和SwiftyJSON的应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

1. HandyJSON的應用

想要通過HandyJSON實現序列化和反序列化, 必須實現HandyJSON協議, 不需要繼承NSObject對象, 實現協議必須實現public init(){} 方法.

序列化和反序列化支持struct和enumerate類型.

HandyJSON可支持非基礎類型

var bool: Bool = truevar intOptional: Int?var doubleImplicitlyUnwrapped: Double!var anyObjectOptional: Any?var arrayInt: Array<Int> = []var arrayStringOptional: Array<String>?var setInt: Set<Int>?var dictAnyObject: Dictionary<String, Any> = [:]var nsNumber = 2var nsString: NSString?

1.1 反序列化

class BasicTypes: HandyJSON {var int: Int = 2var doubleOptional: Double?var stringImplicitlyUnwrapped: String!required init() {} }let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1}" if let object = BasicTypes.deserialize(from: jsonString) {print(object.int)print(object.doubleOptional!)print(object.stringImplicitlyUnwrapped) }// HandyJSON提供的幾種序列化的方法 let person = SOHomeModel.deserialize(from: <#T##NSDictionary?#>) let person = SOHomeModel.deserialize(from: <#T##NSDictionary?#>, designatedPath: <#T##String?#>) let person = SOHomeModel.deserialize(from: <#T##String?#>) let person = SOHomeModel.deserialize(from: <#T##String?#>, designatedPath: <#T##String?#>) let persons = [SOHomeModel].deserialize(from: <#T##String?#>) let persons = [SOHomeModel].deserialize(from: <#T##String?#>, designatedPath: <#T##String?#>)

1.2 序列化

序列化, 支持序列化成字符串, dictionary.

let object = BasicTypes() object.int = 1 object.doubleOptional = 1.1 object.stringImplicitlyUnwrapped = “hello"print(object.toJSON()!) // serialize to dictionary print(object.toJSONString()!) // serialize to JSON string print(object.toJSONString(prettyPrint: true)!) // serialize to pretty JSON string

1.3 可指定解析路徑

let jsonString = "{\"code\":200,\"msg\":\"success\",\"data\":{\"cat\":{\"id\":12345,\"name\":\"Kitty\"}}}"if let cat = Cat.deserialize(from: jsonString, designatedPath: "data.cat") {print(cat.name) }

注意,如果Model的屬性不是基本類型或集合類型,那么它必須是一個服從HandyJSON協議的類型。 如果是泛型集合類型,那么要求泛型實參是基本類型或者服從HandyJSON協議的類型。

1.4 HandyJSON支持自定義解析規則

還沒看明白, 還不會用

1.5 排除指定屬性

如果在Model中存在因為某些原因不能實現HandyJSON協議的非基本字段,或者不能實現HandyJSONEnum協議的枚舉字段,又或者說不希望反序列化影響某個字段,可以在mapping函數中將它排除。如果不這么做,可能會出現未定義的行為。 (其實這個還不太明白, 就是說如果不想讓序列化影響某個字段, 就在mapping方法中忽略嗎? 測試發現忽略后一樣會賦值)

class NotHandyJSONType {var dummy: String? }class Cat: HandyJSON {var id: Int64!var name: String!var notHandyJSONTypeProperty: NotHandyJSONType?var basicTypeButNotWantedProperty: String?required init() {}func mapping(mapper: HelpingMapper) {mapper >>> self.notHandyJSONTypePropertymapper >>> self.basicTypeButNotWantedProperty} }let jsonString = "{\"name\":\"cat\",\"id\":\"12345\"}"if let cat = Cat.deserialize(from: jsonString) {print(cat) }

2.SwiftyJSON的應用

// 初始化 let json = JSON(data: jsonData) if let number = json[0]["phones"][0]["number"].string {// 找到電話號碼print("第一個聯系人的第一個電話號碼:",number) } 與Alamofire結合 //創建URL對象 let url = URL(string:"http://www.hangge.com/getJsonData.php")!Alamofire.request(url).validate().responseJSON { response inswitch response.result.isSuccess {case true:if let value = response.result.value {let json = JSON(value)if let number = json[0]["phones"][0]["number"].string {// 找到電話號碼print("第一個聯系人的第一個電話號碼:",number)}}case false:print(response.result.error)} }

2.1 可選值和不可選值

1.可選值獲取(Optional getter)

通過.number、.string、.bool、.int、.uInt、.float、.double、.array、.dictionary、int8、Uint8、int16、Uint16、int32、Uint32、int64、Uint64等方法獲取到的是可選擇值,我們需要自行判斷是否存在,同時不存在的話可以獲取具體的錯誤信息。

//int if let age = json[0]["age"].int {print(age) } else {//打印錯誤信息print(json[0]["age"]) }//String if let name = json[0]["name"].string {print(name) } else {//打印錯誤信息print(json[0]["name"]) }

2.不可選值獲取(Non-optional getter)

使用 xxxValue 這樣的屬性獲取值,如果沒獲取到的話會返回一個默認值。省得我們再判斷拆包了。

//If not a Number or nil, return 0 let age: Int = json[0]["age"].intValue//If not a String or nil, return "" let name: String = json[0]["name"].stringValue//If not a Array or nil, return [] let list: Array<JSON> = json[0]["phones"].arrayValue//If not a Dictionary or nil, return [:] let phone: Dictionary<String, JSON> = json[0]["phones"][0].dictionaryValue

3.獲取原始數據(Raw object)

let jsonObject = json.object as AnyObjectlet jsonObject = json.rawValue as AnyObject//JSON轉化為Data let data = json.rawData()//JSON轉化為String字符串 if let string = json.rawString() {//Do something you want }//JSON轉化為Dictionary字典([String: AnyObject]?) if let dic = json.dictionaryObject {//Do something you want }//JSON轉化為Array數組([AnyObject]?) if let arr = json.arrayObject {//Do something you want }

4.設置值

json[0]["age"].int = 101 json[0]["name"].string = "hangge.com" json[0]["phones"].arrayObject = [["name":"固話", "number":110],["name":"手機", "number":120]]

5.下標訪問(Subscript)

//方式1 let number = json[0]["phones"][0]["number"].stringValue//方式2 let number = json[0,"phones",0,"number"].stringValue//方式3 let keys:[JSONSubscriptType] = [0,"phones",0,"number"] let number = json[keys].stringValue

6.循環遍歷JSON對象中的所有數據

(1)如果JSON數據是數組類型(Array)

for (index,subJson):(String, JSON) in json {print("\(index):\(subJson)") }

(2)如果JSON數據是字典類型(Dictionary)

for (key,subJson):(String, JSON) in json[0] {print("\(key):\(subJson)") }

Reference:

https://github.com/alibaba/HandyJSON/blob/master/README_cn.md

http://www.hangge.com/blog/cache/detail_968.html

轉載于:https://my.oschina.net/whforever/blog/876710

總結

以上是生活随笔為你收集整理的HandyJSON和SwiftyJSON的应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。