HandyJSON第三方库的日常使用与错误记录
一、错误提示
1、更新Xcode10.2,Swift5.0出现错误提示
二、HandyJSON的使用
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!)}print("-----------------------------")//序列化let objectOne = BasicTypes()objectOne.int = 1objectOne.doubleOptional = 2.2objectOne.stringImplicitlyUnwrapped = "world"print(objectOne.toJSON()!)print("-----------------------------")print(objectOne.toJSONString()!)print("-----------------------------")print(objectOne.toJSONString(prettyPrint: true)!)print("-----------------------------")
2、基本数据类型
class BasicTypesTwo: 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?required init() {} }let object = BasicTypesTwo()object.intOptional = 1object.doubleImplicitlyUnwrapped = 1.1object.anyObjectOptional = "StringValue"object.arrayInt = [1, 2]object.arrayStringOptional = ["a", "b"]object.setInt = [1, 2]object.dictAnyObject = ["key1": 1, "key2": "stringValue"]object.nsNumber = 2object.nsString = "nsStringValue"let jsonString = object.toJSONString()!if let object = BasicTypesTwo.deserialize(from: jsonString) {print(object.arrayStringOptional!)print(object.dictAnyObject)//....}
3、指定解析路径
HandyJSON支持指定从哪个具体路径开始解析,反序列化到Model。
class Cat: HandyJSON {var id: Int64!var name: String!required init() {} }let json = "{\"code\":200,\"msg\":\"success\",\"data\":{\"cat\":{\"id\":12345,\"name\":\"Kitty\"}}}"if let cat = Cat.deserialize(from: json, designatedPath: "data.cat") {print(cat.name!)print(cat.id!)}
4、组合对象
注意,如果Model的属性不是基本类型或集合类型,那么它必须是一个服从HandyJSON
协议的类型。
如果是泛型集合类型,那么要求泛型实参是基本类型或者服从HandyJSON
协议的类型。
class Component: HandyJSON {var aInt: Int?var aString: String?required init() {} } class Composition: HandyJSON {var aInt: Int?var comp1: Component?var comp2: Component?required init() {} }let jsonString = "{\"num\":12345,\"comp1\":{\"aInt\":1,\"aString\":\"aaaaa\"},\"comp2\":{\"aInt\":2,\"aString\":\"bbbbb\"}}"if let composition = Composition.deserialize(from: jsonString) {print(composition.comp1?.aString! as Any)print(composition.comp2?.aInt! as Any)}
5、继承
如果子类要支持反序列化,那么要求父类也服从HandyJSON
协议。
let jsonString = "{\"id\":12345,\"color\":\"black\",\"name\":\"cat\"}"if let cat = Cat.deserialize(from: jsonString) {print(cat)}
6、JSON数组
如果JSON的第一层表达的是数组,可以转化它到一个Model数组。
let jsonArrayString: String? = "[{\"name\":\"Bob\",\"id\":\"1\"}, {\"name\":\"Lily\",\"id\":\"2\"}, {\"name\":\"Lucy\",\"id\":\"3\"}]"if let cats = [Cat].deserialize(from: jsonArrayString) {cats.forEach({ (cat) inprint(cat?.name! as Any)print(cat?.id! as Any)})}
7、字典 -> 模型
class BasicTypes: HandyJSON {var int: Int = 2var doubleOptional: Double?var stringImplicitlyUnwrapped: String!required init() {} }var dict = [String: Any]()dict["doubleOptional"] = 1.1dict["stringImplicitlyUnwrapped"] = "hello"dict["int"] = 1if let object = BasicTypes.deserialize(from: dict) {print(object.doubleOptional as Any)print(object.stringImplicitlyUnwrapped as Any)print(object.int)}
8、自定义解析规则
开发中某些关键字段为避免混淆,可以使用其他关键字替换
class Person: HandyJSON {var ID: Int64!var username: String!var parents: (String, String)?required init() {}func mapping(mapper: HelpingMapper) {mapper <<<self.ID <-- "cat_id"mapper <<<self.username <-- "name"} }let jsonString = "{\"cat_id\":12345,\"name\":\"Kitty\",\"parent\":\"Tom/Lily\",\"friend\":{\"id\":54321,\"name\":\"Lily\"}}"if let person = Person.deserialize(from: jsonString) {print(person.ID as Any)print(person.username as Any)}
9、日常开发接口测试
class CarList : HandyJSON {var ID : String!var pic : String?var comname : String?var address : String?required init() {}func mapping(mapper: HelpingMapper) {mapper <<<self.ID <-- "id"} }//返回json样式 //成功: //{ // "status": 1, // "result": [{ // "id": "1", // "pic": "图片地址", // "comname": "汽车美容店", // "address": "广东省" // }] //} //失败: //{ // "status":0, // "msg":"获取失败,请稍后重试..." //} let dict = ["pagesize":10,"page":1,"address":""] as [String : Any]NANetworkHandler.shareInstance.postRequest("https://******/submit_ajax.ashx?action=APP_GetBusiness", params: dict, success: { (response) inlet resultJson = responseif resultJson["status"] as! Int == 1 {if let carArr = [CarList].deserialize(from: (resultJson["result"] as! Array) ) {carArr.forEach({ (car) inprint("\(String(describing: car?.ID))")print("\(String(describing: car?.pic))")print("\(String(describing: car?.comname))")print("\(String(describing: car?.address))")})}}else if response["status"] as! Int == 0 {//... }}) { ( err) in//...}
附:
Alamofire简单封装
import UIKit import Alamofirepublic typealias Success = (_ dict : [String:Any])->() public typealias Failure = (_ error : Error)->() class NANetworkHandler : NSObject {static var shareInstance : NANetworkHandler {struct Share {static let instance = NANetworkHandler()}return Share.instance}//GET请求 func getRequest(_ urlString: String,params: Parameters? = nil,success: @escaping Success,failure: @escaping Failure){request(urlString, params: params, method: .get, success, failure)}//POST请求 func postRequest(_ urlString: String,params: Parameters? = nil,success: @escaping Success,failure: @escaping Failure){request(urlString, params: params, method: .post, success, failure)}//图片上传func upLoadImageRequest(urlString : String, params:[String:String], imgArr:[UIImage], name: [String],success : @escaping Success, failure : @escaping Failure){let headers = ["content-type":"multipart/form-data"]Alamofire.upload(multipartFormData: { multipartFormData inif imgArr.count == 0 {return}//此处循环上传多占图片for (index, value) in imgArr.enumerated() {let imageData = UIImage.jpegData(value)(compressionQuality: 0.5)!let formatter = DateFormatter()formatter.dateFormat = "yyyyMMddHHmmss"let str = formatter.string(from: Date())let fileName = str+"\(index)"+".jpg"multipartFormData.append(imageData, withName: "imageUpload", fileName: fileName, mimeType: "image/png")}},to: urlString,headers: headers,encodingCompletion: { encodingResult inswitch encodingResult {case .success(let upload, _, _):upload.responseJSON { response inif let value = response.result.value as? [String: Any] {success(value as [String : Any])}}breakcase .failure(let err):failure(err)break}})}private func request(_ urlString: String,params:Parameters? = nil,method:HTTPMethod,_ success:@escaping Success,_ failure:@escaping Failure){let manager = Alamofire.SessionManager.defaultmanager.session.configuration.timeoutIntervalForRequest = 15manager.request(urlString, method: method, parameters: params, encoding: JSONEncoding.default, headers: nil).responseJSON { (response) inswitch response.result {case .success:if let value = response.result.value as? [String: Any] {success(value as [String : Any])}breakcase .failure(let err):failure(err)break}}} }
转载于:https://www.cnblogs.com/xjf125/p/10704369.html
HandyJSON第三方库的日常使用与错误记录相关推荐
- 安装python第三方库
前言 接触python编程很晚,基础语法比较好理解,但是用起来还是需要用心的,特别是可能会用到许多第三方库,本文就介绍一下python第三方库的安装. 环境 系统环境:win7_64; Python版 ...
- Arduino引用第三方库ads1x15提示No such file or directory
错误相关 错误说明 排查错误 解决方案 1.安装别的第三方库 2.安装BusIO 错误说明 VS Code联网安装了第三方库,并且引用,但arduino编译器报错目录不存在,此时Arduino IDE ...
- Pycharm安装第三方库以及出错原因(Mac版)
为什么你的mac的pycharm import numpy出错呀?为什么用不了numpy.pandas.matplotlib.scipy呀?为什么安装不了它们啊. 目录 一.安装第三方库(numpy. ...
- 【python第三方库安装教程】
python库的安装 最近在学python的时候遇到了一些安装第三方库的问题,下面来记录一下我的解决过程. 1.MyQR库安装 2.jieba库安装 3.wordcloud库安装 在正式说库之前先解决 ...
- 导入第三方库报 unknown type name 'NSString' 错误
添加包含 C OC C++混编文件的第三方库 报unknown type name 'NSString' 错误: stackOverflow上找到解决方法: 在所在项目pch文件中,把自己所#impo ...
- python安装第三方库-常见错误解决
python安装第三方库(例子requests.numpy) 在本地安装python,并配置好相应的环境变量(自行百度很简单) 直接cmd 命令pip list可查看当前python下已经默认安装了哪 ...
- python pip安装第三方库老是报错_#python pip 安装dlib一直失败?#python安装dlib错误...
#python pip 安装dlib一直失败?#python安装dlib错误 python dlib 教程2020-10-11 07:52:36人已围观 ubuntu里面怎么安装dlib 下面是在ub ...
- Windows下使用pip工具安装第三方库报C++错误的解决方案
前言 在 Windows 下安装 Python 进行开发,经常会使用 pip 或 pip3 工具来安装各种第三方库,随着使用的深入,大概率会遇到 "error: Microsoft Visu ...
- pip安装第三方库(mysqlclient)失败,cl.exe错误;pip安装库的过程
这里写自定义目录标题 pip安装mysqlclient失败解决方法 解决方法 报错原因以及pip安装库的过程 pip安装mysqlclient失败解决方法 安装mysqlclient或者某些第三方库的 ...
最新文章
- Elasticsearch入门Demo(一)
- Iframe中的SSRS报表中使用windows.open在新窗口中不能打开URL中的问题
- GLUT键盘控制(glutKeyboardFunc和glutSpecialFunc)
- django--模板继承、组件、自定义标签
- 云栖发布|阿里云消息队列 RocketMQ 5.0:消息、事件、流融合处理平台
- MFC使用CCommandLineInfo处理命令行
- oracle用户和mysql用户_oracle数据库解锁和锁定用户命令
- MySQL连不上:ERROR 1698 (28000): Access denied for user 'root'@'localhost'
- VirtualBox 复制虚拟机 克隆系统
- 【云计算】阿里云云计算架构师ACE成长路线v2
- 到底什么才是自动化巡检?
- android adb驱动win7,adbwin7下载地址_win7安装adb驱动的方法
- 微信小游戏开发怎么选游戏引擎
- 在Google上做搜索引擎优化 (SEO),最重要的是哪几点?
- S7Comm Plus 协议研究
- 达叔机器学习笔记1_逻辑回归建立一般流程
- 面向对象文字游戏,蜈蚣怪和蛇怪
- android banner无限轮播,LoopBanner - 可以自动轮播的无限循环banner
- H5静态网页设计与制作_川西旅游网设计作品(HTML+CSS+jQuery)
- 网站服务安全访问(HTTPS)