一、错误提示

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. Servlet------>ServletConfig和ServletContext

    原理图: 之一--------->servletConfig 有些时候,有些参数不适合写死,而且初始化servlet要用,可以通过这个头来调用servletConfig 例如:serlet数据库 ...

  2. python3在centos6.6上的安装

    建议:在看这个文档操作前,最好先参考一下这个:https://www.cnblogs.com/bookwed/p/10251236.html,是解决pip安装模块时,提示ssl版本低的问题. #提前的 ...

  3. python学习笔记——字符串

    类方法string.upper(str)需要引入string模块,实例方法str.upper()不需要引入string模块 无与伦比的列表解析功能 # coding=utf-8 # 列表解析 prin ...

  4. ObjectDetection中的一些名词中英文对照

    mAP:mean Average Precision,平均精确度 recall rate:召回率 Loss Function Anchro

  5. linux环境下的python安装过程

    一.下载python源码包 打开ubuntu下的shell终端,通过wget命令下载python源码包,如下图所示: wget https://www.python.org/ftp/python/3. ...

  6. python与c语言交互应用实例

    1.python向c语言写数据 1) 先将接收端编译成一个共享链接库gcc/arm-linux-gnueabihf-gcc -o bluetooth_proxy.so -shared -fPIC bl ...

  7. 使用curl发送post或者get数据

    一. 使用curl可以仿造http的请求,向目标服务器或者是目标IP发送数据,进行操作. (1).使用php操作curl向某个接口上发送GET请求: 下面是写的一个比较简单的请求方式请求数据,传入的参 ...

  8. 剑指offer-java

    面试题67 机器人的运动范围 题意: 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. ...

  9. python手写bp神经网络实现人脸性别识别1.0

    写在前面:本实验用到的图片均来自google图片,侵删! 实验介绍 用python手写一个简单bp神经网络,实现人脸的性别识别.由于本人的机器配置比较差,所以无法使用网上很红的人脸大数据数据集(如lf ...

  10. C++学习笔记-隐式成员函数

    通过一个例子来复习C++操作符重载及隐式成员函数.MyString类模仿标准string类,简单的实现了构造一个字符串.字符串比较.取单个字符等功能.如下: #ifndef MYSTRING_H_ # ...