https://www.jianshu.com/p/25db8030dba2
2018.05.02 20:20:16字数 1,493阅读 5,017
一 简介
二 特性
三 安装使用以及封装
四 使用示例
五 总结
一 简介
HandyJSON是一个用于Swift语言中的JSON序列化/反序列化库。
与其他流行的Swift JSON库相比,HandyJSON的特点是,它支持纯swift类,使用也简单。它反序列化时(把JSON转换为Model)不要求Model从NSObject继承(因为它不是基于KVC机制),也不要求你为Model定义一个Mapping函数。只要你定义好Model类,声明它服从HandyJSON协议,HandyJSON就能自行以各个属性的属性名为Key,从JSON串中解析值。
HandyJSON目前依赖于从Swift Runtime源码中推断的内存规则,任何变动我们将随时跟进。
二 特性
-
序列化Model到JSON、从JSON反序列化到Model
-
自然地以Model的属性名称作为解析JSON的Key,不需要额外指定
-
支持Swift中大部分类型
-
支持class、struct定义的Model
-
支持自定义解析规则
-
类型自适应,如JSON中是一个Int,但对应Model是String字段,会自动完成转化
三 安装使用以及封装
3.1 安装
我使用的是cocopod进行包引入管理,修改Prodfie文件,添加如下代码:
pod 'HandyJSON', '~> 4.1.1'
官方说明(swift3.0用大于1.8.0版本的 swift4.0用4.1.1):
To use with Swift 3.x using >= 1.8.0 To use with Swift 4.0 using == 4.1.1
实际使用过程中,1.8.0是有问题的,有个必现的bug,建议直接用4.1.1版本的,4.1如果安装失败,请更新你的cocopod到最新版
3.2 封装
为了方便我们项目中的使用,我们一般都会在做一层封装,方便库的以后升级替换,以及方便日常业务逻辑的处理
JsonUtil.swift import UIKit import HandyJSON class JsonUtil: NSObject { /** * Json转对象 */ static func jsonToModel(_ jsonStr:String,_ modelType:HandyJSON.Type) ->BaseModel { if jsonStr == "" || jsonStr.count == 0 { #if DEBUG print("jsonoModel:字符串为空") #endif return BaseModel() } return modelType.deserialize(from: jsonStr) as! BaseModel } /** * Json转数组对象 */ static func jsonArrayToModel(_ jsonArrayStr:String, _ modelType:HandyJSON.Type) ->[BaseModel] { if jsonArrayStr == "" || jsonArrayStr.count == 0 { #if DEBUG print("jsonToModelArray:字符串为空") #endif return [] } var modelArray:[BaseModel] = [] let data = jsonArrayStr.data(using: String.Encoding.utf8) let peoplesArray = try! JSONSerialization.jsonObject(with:data!, options: JSONSerialization.ReadingOptions()) as? [AnyObject] for people in peoplesArray! { modelArray.append(dictionaryToModel(people as! [String : Any], modelType)) } return modelArray } /** * 字典转对象 */ static func dictionaryToModel(_ dictionStr:[String:Any],_ modelType:HandyJSON.Type) -> BaseModel { if dictionStr.count == 0 { #if DEBUG print("dictionaryToModel:字符串为空") #endif return BaseModel() } return modelType.deserialize(from: dictionStr) as! BaseModel } /** * 对象转JSON */ static func modelToJson(_ model:BaseModel?) -> String { if model == nil { #if DEBUG print("modelToJson:model为空") #endif return "" } return (model?.toJSONString(