一、错误提示

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. js 匿名函数-立即调用的函数表达式

    先提个问题, 单独写匿名函数为什么报错?return 匿名函数 为什么不报错? 如图: 第二种情况在 f 还没有执行的时候,就报错了,,,当然这得归因于函数声明语句声明提前(发生在代码执行之前)的原因 ...

  2. Windows 2012 Server评估版本安装问题处理

    由于工作需要,在微软官方网站下载了一个Windows2012评估版本,地址:http://technet.microsoft.com/zh-cn/evalcenter/hh670538.aspx 在通 ...

  3. Node REPL

    Node 自带了交互式解释器,可以执行以下任务: 读取 - 读取用户输入,解析输入了Javascript 数据结构并存储在内存中. 执行 - 执行输入的数据结构 打印 - 输出结果 循环 - 循环操作 ...

  4. bootloader,kernel,initrc

    http://www.ibm.com/developerworks/cn/linux/l-k26initrd/index.html http://www.68idc.cn/help/server/li ...

  5. python序列化和json

    python 的序列化和反序列化用于内存之间的共享,包括服务器和客户端的共享,两个Python程序之间的共享,以及以字符串的形式存储到硬盘中. pyhton 的pickle 可以对Python的各种数 ...

  6. HttpRunnerManager平台异步生成及展示代码覆盖率报告

    ant+jacoco+jenkins+HttpRunnerManager代码覆盖率统计平台搭建 实现思路通过jenkins构建,并使用HttpRunnerManager异步实现报告更新与展示. 现在整 ...

  7. Spark2.0机器学习系列之6:GBDT(梯度提升决策树)、GBDT与随机森林差异、参数调试及Scikit代码分析

    概念梳理 GBDT的别称 GBDT(Gradient Boost Decision Tree),梯度提升决策树.     GBDT这个算法还有一些其他的名字,比如说MART(Multiple Addi ...

  8. Mysql binlog 安全删除(转载)

    简介: 如果你的 Mysql 搭建了主从同步 , 或者数据库开启了 log-bin 日志 , 那么随着时间的推移 , 你的数据库 data 目录下会产生大量的日志文件 shell > ll /u ...

  9. 爬虫——请求库之requests

    阅读目录 一 介绍 二 基于GET请求 三 基于POST请求 四 响应Response 五 高级用法 一 介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,reque ...

  10. 安装mysql8.0.11以及修改root密码、连接navicat for mysql。

    最近在学习node.js,少不得要跟数据库打交道,于是打算安装一个数据库软件,在mongedb和mysql之间选择了mysql.作为一个数据库新人不敢评论孰好孰坏,最后选择mysql纯属因为公司在用m ...