javascript
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 string1.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].dictionaryValue3.獲取原始數據(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].stringValue6.循環遍歷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的应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java去除使用富文本编辑器时自动生成的
- 下一篇: 数字图像处理笔记——Snakes算法、活