下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Swift实现JSON专Mode的方法及HandyJSO使用讲解背景:很多时候,我们从服务端请求下的数据都是J0格式,我们需要拿这些数据显示到我们的I面。因此,我们的做法基本都会先将转为方便使用的数据模型,或者也可以直接转字典解决。在O中,我们有很多优秀的第三方库帮助我们实现,比女MJten、JSONMode等,这些库基本都是利用nti实现读取属性名并利用重新赋值属性。在Swif中,由于nti的局限,比较出名的有SwiftyJSONOetMa等。e其中:1 SwiftyJSON本质上仍然是根据JSON结构去取值,使用起来顺手、清晰;但这种做法没能妥善解决上述的几个问题,因为它不是机遇ode的,
2、我们使用的时候,依然必须制定e去获取al,这在定程度上不是很友好。2 OetMa实现了JSON直接转Mode的功能,不过使用起来,代码量会多一点,因为我们必须遵循Maa协议,制定内的每一个e和ode属性的对应关系。比如:构造的la必须满足这三个红框的内容,这对于使用习惯了直接定义Mode属性的同学来说,可能会有点不习惯。那么,今天的主角来,非常简洁方便。HandyJS1?1S2623lldp«JLIreturnnil帼ppinQ(畦卫:Map)radeld<-.trap;qradeName,贝担-('semesterld<-.riap_3radeSectionMa
3、del:MappaDlegiadeld:IntJ0vaigiadeNamiString!|emesterld:IntI=1./lode步到位而且使用起关于HandyJSON原理:摘自网上一段说明如下:HandyJSON另辟蹊径,釆用Swif反射内存赋值的方式来构造Mode实例,保持原汁原味的Swif类定义。stvatSamprid:leDataInt?:HandyJSONletsample=SampleData(id:2)letreBaseResponse<SampleData>(re.codere.data=sampleletonStringretJSO象实例转换到JSON字符串
4、int(jsonString)intode,"data":"id":2ifletmappedObjectJSONeeialieBaseResponse<SampleDataint(mappedObject.data?.id)假设这是服务端返回的统一定义的eo格式jlaaeeoneHandyJSONHandyJSONaodei:务端返回码adata:体的data的格式和业务相关,故用泛型定义publicrequiredinit()假/设这是某一个业务具体的数据格式定义de从字符串转换为对象实例ononStrin关于HandyJSON如何集成使用:1、
5、pod引入pod'HandyJSON'2、使用时,先头部importimportHandyJSON正文:1、HandyJSON支持JSON直接转Model,定义class时,有两点注意:-必须遵循HandyJSON协议-需要实现空的initializer(当然Struct结构体可以不需要init(),下文有说明)classBasicTypes:HandyJSONvarint:Int=2vardoubleOptional:Double?varstringImplicitlyUnwrapped:String!requiredinit()letjsonString="&qu
6、ot;doubleOptional":1.1,"stringImplicitlyUnwrapped":"hello","int":1"ifletobject=BasicTypes.deserialize(from:jsonString)/这是最简单的模型,只有三个属性,对于复杂的嵌套结构,一样这样处理实现,参考下文。2、HandyJSON还支持Struct,使用方式与Class基本一致structBasicTypes:HandyJSONvarint:Int=2vardoubleOptional:Double?var
7、stringImplicitlyUnwrapped:String!letjsonString=""doubleOptional":1.1,"stringImplicitlyUnwrapped":"hello","int":1"ifletobject=BasicTypes.deserialize(from:jsonString)/这里注意一下,虽然Struct自己已经帮助构造了init初始化,但如果我们需要重载nit,构造我们自己的初始化,还是需要写一下的。3、HandyJSON支持枚举,只需要e
8、num构造时服从HandyJSONEnum协议即可。enumAnimalType:String,HandyJSONEnumcaseCat="cat"caseDog="dog"caseBird="bird"structAnimal:HandyJSONvarname:String?vartype:AnimalType?letjsonString=""type":"cat","name":"Tom""ifletanimal=Animal.de
9、serialize(from:jsonString)print(animal.type?.rawValue)4、此外,HandyJSON还支持一些非基础类型、复杂类型,包括嵌套结构,如可选、隐式解包可选、集合等classBasicTypes:HandyJSONvarbool:Bool=truevarintOptional:Int?vardoubleImplicitlyUnwrapped:Double!varanyObjectOptional:Any?vararrayInt:Array<Int>=vararrayStringOptional:Array<String>?v
10、arsetInt:Set<Int>?vardictAnyObject:Dictionary<String,Any>=:varnsNumber=2varnsString:NSString?requiredinit()letobject=BasicTypes()Optional=1object.doubleImplicitlyUnwrapped=1.1object.anyObjectOptional="StringValue"object.arrayInt=1,2object.arrayStringOptional="a&q
11、uot;,"b"object.setInt=1,2object.dictAnyObject="key1":1,"key2":"stringValue"object.nsNumber=2object.nsString="nsStringValue"letjsonString=object.toJSONString()!ifletobject=JSONDeserializer<BasicTypes>.deserializeFrom(json:jsonString)/.5、HandyJSO
12、N支持指定从哪个具体路径开始解析,反序列化到Model。这个比较常用,因为正常情况下,接口一般都会返回包括错误码,错误消息,正式请求数据等,但我们一般只需要把正式数据转换成Model即可。我们可以这样实现:classCat:HandyJSONvarid:Int64!varname:String!requiredinit()letjsonString=""code":200,"msg":"success","data":"cat":"id":12345,"n
13、ame":"Kitty""ifletcat=JSONDeserializer<Cat>.deserializeFrom(json:jsonString,designatedPath:"data.cat")print()其中,直接通过designatedPath定位到我们需要的节点处。6、handyJSON支持有继承关系的Model类,就是说及时某个类没有实现HandyJSON协议,只要父类有实现,依然可以转化model。classAnimal:HandyJSONvarid:Int?varcolor:Stri
14、ng?requiredinit()classCat:Animalvarname:String?requiredinit()letjsonString=""id":12345,"color":"black","name":"cat""ifletcat=JSONDeserializer<Cat>.deserializeFrom(json:jsonString)print(cat)7、上面都是基本在说JSON转模型,那么反过来实现呢?HandyJSON还支持对象转字典、
15、对象转模型。classBasicTypes:HandyJSONvarint:Int=2vardoubleOptional:Double?varstringImplicitlyUnwrapped:String!requiredinit()letobject=BasicTypes()=1object.doubleOptional=1.1object.stringImplicitlyUnwrapped=“hello"print(object.toJSON()!)/序列化到字典print(object.toJSONString()!)/序列化到JSON字符串print(object.toJSONString(prettyPrint:true)!)/序列化为格式化后的JSON字符串如果需要Demo,可以这样:測试HandyJSONTactUa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年规范化设备采购协议范例
- 2024年设备维护保养服务协议
- 2024年基站场地租赁协议模板
- 店铺出租协议文本 2024 年
- 2024泵车租赁协议定制集锦
- 2024年商业街店铺租赁协议
- 2024年专业委托信用担保服务协议
- 2024年规范化小型物流服务协议
- 2024年定制反担保保障协议
- 2024年度房产指标交易协议模板
- 关于新疆土地承包合同范本
- 【基于近五年数据的云南嘉华食品实业财务报表分析15000字】
- 2023年汉字听写大会汉字听写知识竞赛题库及答案(共三套)
- 防火及动火作业监理实施细则
- 《大学计算机基础(Windows10+Office2016)》试卷213749
- 机械动力学PPT完整全套教学课件
- 粗铜冶炼技改项目可行性研究报告
- 结构形态造型
- 温润童心博爱至善
- 04D702-1 常用低压配电设备安装
- 大学生心理健康教育课程说课课件
评论
0/150
提交评论