一、HandyJSON簡介
HandyJSON 是阿里開發(fā)的一個(gè)在swift上把JSON數(shù)據(jù)轉(zhuǎn)化為對(duì)應(yīng)model的框架。與其他流行的Swift JSON庫相比蓖柔,HandyJSON的特點(diǎn)是署隘,它支持純swift類蓬戚,使用也簡單喉脖。它反序列化時(shí)(把JSON轉(zhuǎn)換為Model)不要求Model從NSObject繼承(因?yàn)樗皇腔贙VC機(jī)制)椰苟,也不要求你為Model定義一個(gè)Mapping函數(shù)。只要你定義好Model類树叽,聲明它服從HandyJSON協(xié)議舆蝴,HandyJSON就能自行以各個(gè)屬性的屬性名為Key,從JSON串中解析值题诵。不過因?yàn)镠andyJSON是基于swift的metadata來做的洁仗,如果swift的metadata的結(jié)構(gòu)改了,HandyJSON可能就直接不能用了性锭。當(dāng)然阿里一直在維護(hù)這個(gè)框架赠潦,swift的源碼有變化,相信框架也是相對(duì)于有改變的草冈。github地址她奥。
二、HandyJSON導(dǎo)入項(xiàng)目
1疲陕、當(dāng)然最簡單的方式用cocoapod的方式導(dǎo)入啦
podfile文件里加入:pod 'HandyJSON', '~> 5.0.2'
然后執(zhí)行pod install
2方淤、如果使用的是Carthage,也很簡單
github "alibaba/HandyJSON" ~> 5.0.2
三蹄殃、HandyJSON簡單使用
1携茂、這里主要有幾種簡單的json字符串轉(zhuǎn)對(duì)應(yīng)model的情況。先直接展示model類的代碼
import UIKit
import HandyJSON
class Person: HandyJSON {
var doubleOptional: Double?
var stringImplicitlyUnwrapped: String = ""
var int:Int?
var name: String?
required init(){} // 必須實(shí)現(xiàn)一個(gè)空的初始化方法
}
class Component: HandyJSON {
var num: Int?
var comp1: SubComponent?
var comp2: SubComponent?
required init(){}
}
class ComponentArr: HandyJSON {
var num: Int?
var compArr: [SubComponent]?
required init(){}
}
class SubComponent: HandyJSON {
var aInt: Int?
var aString: String = ""
required init(){}
}
//let jsonString = "{\"cat_id\":12345,\"name\":\"Kitty\",\"friend\":{\"id\":54321,\"name\":\"Lily\"}}"
class Cat: HandyJSON {
var id: Int64!
var name: String!
var friendName: String?
required init() {}
func mapping(mapper: HelpingMapper) {
// 把id轉(zhuǎn)換為json數(shù)據(jù)里的key:cat_id诅岩,friendName轉(zhuǎn)化為讀json數(shù)據(jù)里的friend字典中的name字段讳苦。
mapper <<<
self.id <-- "cat_id"
mapper <<<
self.friendName <-- "friend.name"
}
}
2、對(duì)應(yīng)使用的HandyJSON的代碼例子
1吩谦、簡單的解析鸳谜,包括model中有json里不存在的,json中也有model里不存在的內(nèi)容
func parse1() {
// 簡單的解析
let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1,\"msg\":\"world\"}"
if let p: Person = Person.deserialize(from: jsonString){
print(p.doubleOptional!)
print(p.stringImplicitlyUnwrapped)
print(p.int!)
//print(p.name)
}else{
print("解析失敗")
}
}
2式廷、包含對(duì)象嵌套的解析
func parse2() {
let jsonString = "{\"num\":12345,\"comp1\":{\"aInt\":1,\"aString\":\"aaaaa\"},\"comp2\":{\"aInt\":2,\"aString\":\"bbbbb\"}}"
if let mainCom: Component = Component.deserialize(from: jsonString) {
print(mainCom.num!)
}
}
3咐扭、包含數(shù)組對(duì)象的解析
func parse3 () {
let jsonString = "{\"num\":12345,\"compArr\":[{\"aInt\":1,\"aString\":\"aaaaa\"},{\"aInt\":2,\"aString\":\"bbbbb\"}]}"
if let mainCom: ComponentArr = ComponentArr.deserialize(from: jsonString) {
print(mainCom.num!)
for com in mainCom.compArr! {
print(com.aInt!)
print(com.aString)
}
}
}
4、 把字典轉(zhuǎn)成對(duì)象
func parse4 () {
var dict = [String: Any]()
dict["doubleOptional"] = 1.1
dict["stringImplicitlyUnwrapped"] = "hello"
dict["int"] = 1
if let p: Person = Person.deserialize(from: dict) {
print(p.doubleOptional!)
print(p.stringImplicitlyUnwrapped)
print(p.int!)
print(p.name) // 字典里沒有對(duì)應(yīng)的值滑废,為nil
}
}
5蝗肪、 包含自定義解析:當(dāng)model的屬性名和json里的對(duì)應(yīng)不上的時(shí)候,model里實(shí)現(xiàn)mapping函數(shù)去對(duì)應(yīng)key蠕趁。
func parse5() {
let jsonString = "{\"cat_id\":12345,\"name\":\"Kitty\",\"parent\":\"Tom/Lily\",\"friend\":{\"id\":54321,\"name\":\"Lily\"}}"
if let cat: Cat = Cat.deserialize(from: jsonString) {
print(cat);
}
}