一、错误提示

1、更新Xcode10.2,Swift5.0出现错误提示

Undefined symbols for architecture x86_64:
"_swift_getFieldAt", referenced from:
HandyJSON.Metadata.Class._propertyDescriptionsAndStartPoint() -> ([HandyJSON.Property.Description], Swift.Int32?)? in Metadata.o
HandyJSON.Metadata.Struct.propertyDescriptions() -> [HandyJSON.Property.Description]? in Metadata.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
 
更改 podfile
pod 'HandyJSON', '5.0.0-beta'
如果不行的话 更新本地cocoapods的spec资源配置信息。
pod repo update
笔者是使用的第二种方法进行解决的。
 

二、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第三方库的日常使用与错误记录的更多相关文章

  1. Python之常用第三方库总结

    在使用python进行开发的时候,经常我们需要借助一些第三方库,进行日常代码的开发工作.这里总结一些常用的类库 1. requests Requests 是用Python语言编写,基于 urllib, ...

  2. 安装python第三方库

    前言 接触python编程很晚,基础语法比较好理解,但是用起来还是需要用心的,特别是可能会用到许多第三方库,本文就介绍一下python第三方库的安装. 环境 系统环境:win7_64; Python版 ...

  3. iOS开发遇到的坑之六--使用cocopods管理第三方库时,编译出现Library not found for -lPods问题的解决办法

    在项目中有时候会遇到Library not found for -lPods(这里的IPods指的是你具体的第三方库)的问题 出现这个错误的原因是:xcode在编译的时候找不到这个库,从而导致项目无法 ...

  4. Go 日常开发常备第三方库和工具

    不知不觉写 Go 已经快一年了,上线了大大小小好几个项目:心态也经历了几轮变化. 因为我个人大概前五年时间写的是 Java ,中途写过一年多的 Python,所以刚接触到 Go 时的感觉如下图: 既没 ...

  5. iOS真机调试引入第三方库(如友盟等)编译时候,出现错误提示

    用Xcode 7 beta 3在真机(iOS 8.3)上运行一下工程,结果发现工程编译不过.看了下问题,报的是以下错误: MARK:解决方法:在building Setting 中设置bitCode ...

  6. Xcode工程使用CocoaPods管理第三方库新建工程时出现错误

    工程使用CocoaPods管理第三方库,在新的目录update版本的时候出现如下问题   问题1描述: diff: /../Podfile.lock: No such file or director ...

  7. 引入第三方库错误Undefined symbols for architecture i386: _OBJC_CLASS_$的解决方案

    引起标题上所导致的错误是因为你的第三方库没有放入到Compile Sources里面去. 需要到你项目的Targets>>Build Phases>>Compile Sourc ...

  8. Swift迁入第三方库时的版本错误解决

    我的swift的项目用的是swift 2.3的版本,但是用CocoaPods迁入一个第三方:ObjectMapper后,编译会出现这样一个问题: Use Legacy Swift Language V ...

  9. 史上最详细 Python第三方库添加方法 and 错误解决方法

    (1):如何添加python第三方库(方法一): File ->> Settings... ->> Project Interpreter (2):如何添加python第三方库 ...

随机推荐

  1. 用angular引入复杂的json文件2

    昨天我们也说了一下angular引入复杂json文件的方法,今天我们再来学习一种方法,而且更简单,更快捷. 首先我们引入一个angular插件,并且写上引入模块和控制台,在html中书写上模块名和控制 ...

  2. Zabbix自动发现与主动注册

    接上篇:Zabbix监控主动模式 网络自动发现 zabbix agent的配置文件/etc/zabbix/zabbix_agentd.conf 注释StartAgents=0 添加 HostnameI ...

  3. HDU 2157 How many ways??(简单线性DP | | 矩阵快速幂)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2157 这道题目很多人的题解都是矩阵快速幂写的,矩阵快速幂倒是麻烦了许多了.先给DP的方法 dp[i][ ...

  4. Redis集群部署文档(Ubuntu15.10系统)

    Redis集群部署文档(Ubuntu15.10系统)(要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如 ...

  5. CF#301 D:Bad Luck Island (概率dp)

    D:Bad Luck Island 一个岛上有r个石头,s个剪子,p个布,他们之间随机挑出两个相遇,如果不是相同物种,就会有一个消失,分别求出最后这座岛上只剩下一个物种的概率. 我们用dp[i][j] ...

  6. 聊聊高并发(三十四)Java内存模型那些事(二)理解CPU快速缓存的工作原理

    在上一篇聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了Java内存模型是一个语言级别的内存模型抽象.它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的 ...

  7. SharePoint 2013 附加内容数据库后出现404错误

    本文讲述怎样解决SharePoint 2013 加内容数据库(Content DataBase)后出现404错误. 笔者依照http://technet.microsoft.com/en-us/lib ...

  8. JavaScript日期处理

    一.Date类型 在讲述常见日期问题之前,先梳理一下Date类型的方法. ECMAScript中的Date类型使用自UTC(Coordinated in Universal Time,国际协调时间)1 ...

  9. python的曲线平滑工具,及python画一条线中包含不同粗细不同颜色的画线方法

    from scipy.signal import savgol_filter import matplotlib.pyplot as plt cc = savgol_filter(c, 99, 1) ...

  10. php内存溢出,出现Allowed memory size of 8388608 bytes exhausted错误的解决办法

    是因为php页面消耗的最大内存默认是为128M (在PHP的ini件里可以看到) ,如果文件太大或图片太大在读取的时候会发生上述错误. 解决办法: 1.修改 php.ini 将memory_limit ...