HandyJSON第三方库的日常使用与错误记录
一、错误提示
1、更新Xcode10.2,Swift5.0出现错误提示
二、HandyJSON的使用
1、基本操作:序列化与反序列化
class BasicTypes: HandyJSON {
var int: Int =
var 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 =
objectOne.doubleOptional = 2.2
objectOne.stringImplicitlyUnwrapped = "world" print(objectOne.toJSON()!)
print("-----------------------------")
print(objectOne.toJSONString()!)
print("-----------------------------")
print(objectOne.toJSONString(prettyPrint: true)!)
print("-----------------------------")
2、基本数据类型
class BasicTypesTwo: HandyJSON {
var bool: Bool = true
var 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 =
var nsString: NSString? required init() {}
} let object = BasicTypesTwo()
object.intOptional =
object.doubleImplicitlyUnwrapped = 1.1
object.anyObjectOptional = "StringValue"
object.arrayInt = [, ]
object.arrayStringOptional = ["a", "b"]
object.setInt = [, ]
object.dictAnyObject = ["key1": , "key2": "stringValue"]
object.nsNumber =
object.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) in
print(cat?.name! as Any)
print(cat?.id! as Any)
})
}
7、字典 -> 模型
class BasicTypes: HandyJSON {
var int: Int =
var doubleOptional: Double?
var stringImplicitlyUnwrapped: String! required init() {}
} var dict = [String: Any]()
dict["doubleOptional"] = 1.1
dict["stringImplicitlyUnwrapped"] = "hello"
dict["int"] =
if 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":,"page":,"address":""] as [String : Any]
NANetworkHandler.shareInstance.postRequest("https://******/submit_ajax.ashx?action=APP_GetBusiness", params: dict, success: { (response) in
let resultJson = response
if resultJson["status"] as! Int == {
if let carArr = [CarList].deserialize(from: (resultJson["result"] as! Array) ) {
carArr.forEach({ (car) in
print("\(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 == {
//...
} }) { ( err) in
//...
}
附:
Alamofire简单封装
import UIKit
import Alamofire public 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 in if imgArr.count == {
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 in
switch encodingResult {
case .success(let upload, _, _):
upload.responseJSON { response in
if let value = response.result.value as? [String: Any] {
success(value as [String : Any])
}
}
break
case .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.default
manager.session.configuration.timeoutIntervalForRequest =
manager.request(urlString, method: method, parameters: params, encoding: JSONEncoding.default, headers: nil).responseJSON { (response) in
switch response.result {
case .success:
if let value = response.result.value as? [String: Any] {
success(value as [String : Any])
}
break
case .failure(let err):
failure(err)
break
}
}
}
}
HandyJSON第三方库的日常使用与错误记录的更多相关文章
- Python之常用第三方库总结
在使用python进行开发的时候,经常我们需要借助一些第三方库,进行日常代码的开发工作.这里总结一些常用的类库 1. requests Requests 是用Python语言编写,基于 urllib, ...
- 安装python第三方库
前言 接触python编程很晚,基础语法比较好理解,但是用起来还是需要用心的,特别是可能会用到许多第三方库,本文就介绍一下python第三方库的安装. 环境 系统环境:win7_64; Python版 ...
- iOS开发遇到的坑之六--使用cocopods管理第三方库时,编译出现Library not found for -lPods问题的解决办法
在项目中有时候会遇到Library not found for -lPods(这里的IPods指的是你具体的第三方库)的问题 出现这个错误的原因是:xcode在编译的时候找不到这个库,从而导致项目无法 ...
- Go 日常开发常备第三方库和工具
不知不觉写 Go 已经快一年了,上线了大大小小好几个项目:心态也经历了几轮变化. 因为我个人大概前五年时间写的是 Java ,中途写过一年多的 Python,所以刚接触到 Go 时的感觉如下图: 既没 ...
- iOS真机调试引入第三方库(如友盟等)编译时候,出现错误提示
用Xcode 7 beta 3在真机(iOS 8.3)上运行一下工程,结果发现工程编译不过.看了下问题,报的是以下错误: MARK:解决方法:在building Setting 中设置bitCode ...
- Xcode工程使用CocoaPods管理第三方库新建工程时出现错误
工程使用CocoaPods管理第三方库,在新的目录update版本的时候出现如下问题 问题1描述: diff: /../Podfile.lock: No such file or director ...
- 引入第三方库错误Undefined symbols for architecture i386: _OBJC_CLASS_$的解决方案
引起标题上所导致的错误是因为你的第三方库没有放入到Compile Sources里面去. 需要到你项目的Targets>>Build Phases>>Compile Sourc ...
- Swift迁入第三方库时的版本错误解决
我的swift的项目用的是swift 2.3的版本,但是用CocoaPods迁入一个第三方:ObjectMapper后,编译会出现这样一个问题: Use Legacy Swift Language V ...
- 史上最详细 Python第三方库添加方法 and 错误解决方法
(1):如何添加python第三方库(方法一): File ->> Settings... ->> Project Interpreter (2):如何添加python第三方库 ...
随机推荐
- js 匿名函数-立即调用的函数表达式
先提个问题, 单独写匿名函数为什么报错?return 匿名函数 为什么不报错? 如图: 第二种情况在 f 还没有执行的时候,就报错了,,,当然这得归因于函数声明语句声明提前(发生在代码执行之前)的原因 ...
- Windows 2012 Server评估版本安装问题处理
由于工作需要,在微软官方网站下载了一个Windows2012评估版本,地址:http://technet.microsoft.com/zh-cn/evalcenter/hh670538.aspx 在通 ...
- Node REPL
Node 自带了交互式解释器,可以执行以下任务: 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中. 执行 - 执行输入的数据结构 打印 - 输出结果 循环 - 循环操作 ...
- bootloader,kernel,initrc
http://www.ibm.com/developerworks/cn/linux/l-k26initrd/index.html http://www.68idc.cn/help/server/li ...
- python序列化和json
python 的序列化和反序列化用于内存之间的共享,包括服务器和客户端的共享,两个Python程序之间的共享,以及以字符串的形式存储到硬盘中. pyhton 的pickle 可以对Python的各种数 ...
- HttpRunnerManager平台异步生成及展示代码覆盖率报告
ant+jacoco+jenkins+HttpRunnerManager代码覆盖率统计平台搭建 实现思路通过jenkins构建,并使用HttpRunnerManager异步实现报告更新与展示. 现在整 ...
- Spark2.0机器学习系列之6:GBDT(梯度提升决策树)、GBDT与随机森林差异、参数调试及Scikit代码分析
概念梳理 GBDT的别称 GBDT(Gradient Boost Decision Tree),梯度提升决策树. GBDT这个算法还有一些其他的名字,比如说MART(Multiple Addi ...
- Mysql binlog 安全删除(转载)
简介: 如果你的 Mysql 搭建了主从同步 , 或者数据库开启了 log-bin 日志 , 那么随着时间的推移 , 你的数据库 data 目录下会产生大量的日志文件 shell > ll /u ...
- 爬虫——请求库之requests
阅读目录 一 介绍 二 基于GET请求 三 基于POST请求 四 响应Response 五 高级用法 一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,reque ...
- 安装mysql8.0.11以及修改root密码、连接navicat for mysql。
最近在学习node.js,少不得要跟数据库打交道,于是打算安装一个数据库软件,在mongedb和mysql之间选择了mysql.作为一个数据库新人不敢评论孰好孰坏,最后选择mysql纯属因为公司在用m ...