一、错误提示

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 = 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第三方库的日常使用与错误记录相关推荐

  1. 安装python第三方库

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

  2. Arduino引用第三方库ads1x15提示No such file or directory

    错误相关 错误说明 排查错误 解决方案 1.安装别的第三方库 2.安装BusIO 错误说明 VS Code联网安装了第三方库,并且引用,但arduino编译器报错目录不存在,此时Arduino IDE ...

  3. Pycharm安装第三方库以及出错原因(Mac版)

    为什么你的mac的pycharm import numpy出错呀?为什么用不了numpy.pandas.matplotlib.scipy呀?为什么安装不了它们啊. 目录 一.安装第三方库(numpy. ...

  4. 【python第三方库安装教程】

    python库的安装 最近在学python的时候遇到了一些安装第三方库的问题,下面来记录一下我的解决过程. 1.MyQR库安装 2.jieba库安装 3.wordcloud库安装 在正式说库之前先解决 ...

  5. 导入第三方库报 unknown type name 'NSString' 错误

    添加包含 C OC C++混编文件的第三方库 报unknown type name 'NSString' 错误: stackOverflow上找到解决方法: 在所在项目pch文件中,把自己所#impo ...

  6. python安装第三方库-常见错误解决

    python安装第三方库(例子requests.numpy) 在本地安装python,并配置好相应的环境变量(自行百度很简单) 直接cmd 命令pip list可查看当前python下已经默认安装了哪 ...

  7. python pip安装第三方库老是报错_#python pip 安装dlib一直失败?#python安装dlib错误...

    #python pip 安装dlib一直失败?#python安装dlib错误 python dlib 教程2020-10-11 07:52:36人已围观 ubuntu里面怎么安装dlib 下面是在ub ...

  8. Windows下使用pip工具安装第三方库报C++错误的解决方案

    前言 在 Windows 下安装 Python 进行开发,经常会使用 pip 或 pip3 工具来安装各种第三方库,随着使用的深入,大概率会遇到 "error: Microsoft Visu ...

  9. pip安装第三方库(mysqlclient)失败,cl.exe错误;pip安装库的过程

    这里写自定义目录标题 pip安装mysqlclient失败解决方法 解决方法 报错原因以及pip安装库的过程 pip安装mysqlclient失败解决方法 安装mysqlclient或者某些第三方库的 ...

最新文章

  1. Elasticsearch入门Demo(一)
  2. Iframe中的SSRS报表中使用windows.open在新窗口中不能打开URL中的问题
  3. GLUT键盘控制(glutKeyboardFunc和glutSpecialFunc)
  4. django--模板继承、组件、自定义标签
  5. 云栖发布|阿里云消息队列 RocketMQ 5.0:消息、事件、流融合处理平台
  6. MFC使用CCommandLineInfo处理命令行
  7. oracle用户和mysql用户_oracle数据库解锁和锁定用户命令
  8. MySQL连不上:ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  9. VirtualBox 复制虚拟机 克隆系统
  10. 【云计算】阿里云云计算架构师ACE成长路线v2
  11. 到底什么才是自动化巡检?
  12. android adb驱动win7,adbwin7下载地址_win7安装adb驱动的方法
  13. 微信小游戏开发怎么选游戏引擎
  14. 在Google上做搜索引擎优化 (SEO),最重要的是哪几点?
  15. S7Comm Plus 协议研究
  16. 达叔机器学习笔记1_逻辑回归建立一般流程
  17. 面向对象文字游戏,蜈蚣怪和蛇怪
  18. android banner无限轮播,LoopBanner - 可以自动轮播的无限循环banner
  19. H5静态网页设计与制作_川西旅游网设计作品(HTML+CSS+jQuery)
  20. 网站服务安全访问(HTTPS)

热门文章

  1. 小Z的袜子(hose) (莫队算法入门)
  2. 编译型语言与解释型语言
  3. 【Ubuntu系统没有本地网络连接,仅无线网络可用】
  4. 从文本中自动抽取结构化三元组
  5. 鸿蒙一碰闪屏壁纸,不闪屏骗人吗? 戳穿护眼液晶的五大谎言
  6. WAP2.0手机网站的开发
  7. 今天,我拿到蚂蚁金服offer(四面技术,kafka入门视频
  8. 机器学习之超参数优化 - 网格优化方法(随机网格搜索)
  9. LeetCode 708. 循环有序列表的插入*
  10. 笔记,contourf 与 pcolormesh 再画图时的区别