HandyJSON和SwiftyJSON的应用

article/2025/9/12 2:49:58

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1. HandyJSON的应用

想要通过HandyJSON实现序列化和反序列化, 必须实现HandyJSON协议, 不需要继承NSObject对象, 实现协议必须实现public init(){} 方法.

序列化和反序列化支持struct和enumerate类型.

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?

1.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)
}// HandyJSON提供的几种序列化的方法
let person = SOHomeModel.deserialize(from: <#T##NSDictionary?#>)
let person = SOHomeModel.deserialize(from: <#T##NSDictionary?#>, designatedPath: <#T##String?#>)
let person = SOHomeModel.deserialize(from: <#T##String?#>)
let person = SOHomeModel.deserialize(from: <#T##String?#>, designatedPath: <#T##String?#>)
let persons = [SOHomeModel].deserialize(from: <#T##String?#>)
let persons = [SOHomeModel].deserialize(from: <#T##String?#>, designatedPath: <#T##String?#>)

1.2 序列化

序列化, 支持序列化成字符串, dictionary.

let object = BasicTypes()
object.int = 1
object.doubleOptional = 1.1
object.stringImplicitlyUnwrapped = “hello"print(object.toJSON()!) // serialize to dictionary
print(object.toJSONString()!) // serialize to JSON string
print(object.toJSONString(prettyPrint: true)!) // serialize to pretty JSON string

1.3 可指定解析路径

let jsonString = "{\"code\":200,\"msg\":\"success\",\"data\":{\"cat\":{\"id\":12345,\"name\":\"Kitty\"}}}"if let cat = Cat.deserialize(from: jsonString, designatedPath: "data.cat") {print(cat.name)
}

注意,如果Model的属性不是基本类型或集合类型,那么它必须是一个服从HandyJSON协议的类型。 如果是泛型集合类型,那么要求泛型实参是基本类型或者服从HandyJSON协议的类型。

1.4 HandyJSON支持自定义解析规则

还没看明白, 还不会用

1.5 排除指定属性

如果在Model中存在因为某些原因不能实现HandyJSON协议的非基本字段,或者不能实现HandyJSONEnum协议的枚举字段,又或者说不希望反序列化影响某个字段,可以在mapping函数中将它排除。如果不这么做,可能会出现未定义的行为。 (其实这个还不太明白, 就是说如果不想让序列化影响某个字段, 就在mapping方法中忽略吗? 测试发现忽略后一样会赋值)

class NotHandyJSONType {var dummy: String?
}class Cat: HandyJSON {var id: Int64!var name: String!var notHandyJSONTypeProperty: NotHandyJSONType?var basicTypeButNotWantedProperty: String?required init() {}func mapping(mapper: HelpingMapper) {mapper >>> self.notHandyJSONTypePropertymapper >>> self.basicTypeButNotWantedProperty}
}let jsonString = "{\"name\":\"cat\",\"id\":\"12345\"}"if let cat = Cat.deserialize(from: jsonString) {print(cat)
}

2.SwiftyJSON的应用

// 初始化
let json = JSON(data: jsonData)
if let number = json[0]["phones"][0]["number"].string {// 找到电话号码print("第一个联系人的第一个电话号码:",number)
}
与Alamofire结合
//创建URL对象
let url = URL(string:"http://www.hangge.com/getJsonData.php")!Alamofire.request(url).validate().responseJSON { response inswitch response.result.isSuccess {case true:if let value = response.result.value {let json = JSON(value)if let number = json[0]["phones"][0]["number"].string {// 找到电话号码print("第一个联系人的第一个电话号码:",number)}}case false:print(response.result.error)}
}

2.1 可选值和不可选值

1.可选值获取(Optional getter)

通过.number、.string、.bool、.int、.uInt、.float、.double、.array、.dictionary、int8、Uint8、int16、Uint16、int32、Uint32、int64、Uint64等方法获取到的是可选择值,我们需要自行判断是否存在,同时不存在的话可以获取具体的错误信息。

//int
if let age = json[0]["age"].int {print(age)
} else {//打印错误信息print(json[0]["age"])
}//String
if let name = json[0]["name"].string {print(name)
} else {//打印错误信息print(json[0]["name"])
}

2.不可选值获取(Non-optional getter)

使用 xxxValue 这样的属性获取值,如果没获取到的话会返回一个默认值。省得我们再判断拆包了。

//If not a Number or nil, return 0
let age: Int = json[0]["age"].intValue//If not a String or nil, return ""
let name: String = json[0]["name"].stringValue//If not a Array or nil, return []
let list: Array<JSON> = json[0]["phones"].arrayValue//If not a Dictionary or nil, return [:]
let phone: Dictionary<String, JSON> = json[0]["phones"][0].dictionaryValue

3.获取原始数据(Raw object)

let jsonObject = json.object as AnyObjectlet jsonObject = json.rawValue  as AnyObject//JSON转化为Data
let data = json.rawData()//JSON转化为String字符串
if let string = json.rawString() {//Do something you want
}//JSON转化为Dictionary字典([String: AnyObject]?)
if let dic = json.dictionaryObject {//Do something you want
}//JSON转化为Array数组([AnyObject]?)
if let arr = json.arrayObject {//Do something you want
}

4.设置值

json[0]["age"].int =  101
json[0]["name"].string =  "hangge.com"
json[0]["phones"].arrayObject = [["name":"固话", "number":110],["name":"手机", "number":120]]

5.下标访问(Subscript)

//方式1
let number = json[0]["phones"][0]["number"].stringValue//方式2
let number = json[0,"phones",0,"number"].stringValue//方式3
let keys:[JSONSubscriptType] = [0,"phones",0,"number"]
let number = json[keys].stringValue

6.循环遍历JSON对象中的所有数据

(1)如果JSON数据是数组类型(Array)

for (index,subJson):(String, JSON) in json {print("\(index):\(subJson)")
}

(2)如果JSON数据是字典类型(Dictionary)

for (key,subJson):(String, JSON) in json[0] {print("\(key):\(subJson)")
}

Reference:

https://github.com/alibaba/HandyJSON/blob/master/README_cn.md

http://www.hangge.com/blog/cache/detail_968.html

转载于:https://my.oschina.net/whforever/blog/876710


http://chatgpt.dhexx.cn/article/SI9aYMsi.shtml

相关文章

(时频分析学习)Week01:傅里叶级数,S变换与广义S变换

学习内容:了解了傅里叶变换相关内容,掌握了基本的傅里叶函数的性质、特性和背景。了解S变换和广义S变换的公式和具体含义。 s变换: (在"基准"论文中)意义: 公式: (傅里叶原公式),再有ω2πf 和 f(t)x(t)w(τ-t)进行转换 在另一篇论文中: 广义s变换: 加上了一点关…

解构变换矩阵:如何使变换矩阵分解为位移(T),旋转(R),缩放(S)矩阵

解构变换矩阵 给定一个转换的复合矩阵&#xff0c;关于组成该转换的任何单个转换的信息就会丢失。 我们如果有一个复合矩阵&#xff0c;怎么能使其分解为TRS三个矩阵呢&#xff1f;即如何完成下述变化&#xff1a; 其中M是给定的变换矩阵&#xff0c;T是平移矩阵&#xff0c;R是…

SS2022-Z变换-性质-什么是z变换的时移特性?

简 介&#xff1a; 本文介绍了z变换时移特性。 关键词&#xff1a; z变换&#xff0c;时移特性 #mermaid-svg-EnOHOPxDmWhoesDM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-EnOHOPxDmWhoesDM .error-icon{fill:#…

【转】传递函数中拉普拉斯变换的s是用来干什么的?

自控书里一上来就到处是s,这个s到底是个什么东西? 好我知道s是拉普拉斯变换出来的,但为什么要搞这样一个变换?这个s的物理意义是什么? 为什么传递函数的极点决定系统的性质? …… 要解答这些问题,首先要从拉普拉斯变换讲起。 -----------------------------------------…

S变换的Python代码

S变换的Python代码 S变换简介S变换Python程序 S变换简介 S变换&#xff0c;又称为Stockwell变换&#xff0c;由R. G. Stockwell于1996年提出。具体的定义如下&#xff1a; S变换在傅里叶域的表示形式为&#xff1a; 离散的S变换为&#xff1a; S变换克服了短时傅里叶变换固…

S变换画图

The S -transform with windows of arbitraryand varying shape 想画如上的三张图&#xff0c;可是问题 &#xff08;1&#xff09;滤波窗口的平滑实现 The filter (applied to the full 200£400 S-transform matrix)is constructed in Matlab by constructing a two-dime…

【广义S变换】一维广义S变换对非平稳信号处理的matlab仿真

1.软件版本 matlab2013b 2.本算法理论知识 参考文献: 《广义S变换时频分析的应用研究》 《时频分布与地震信号谱分析研究》 《非平稳信号广义S不变换及其在SAR图像分析中的应用研究》 《S变换时变滤波在去噪处理中的应用研究》 《广义S变换域时频特征分析及微弱目标检测…

频域/s域/z域三大变换的性质对比

本文主要介绍三大变换&#xff08;傅里叶变换、拉普拉斯变换及Z变换&#xff09;的性质对比及其常用信号变换。

S域到Z域变换和差分方程

1.s域的传递函数 G(s) 2 / (1500s 1) * exp(-100s) matlab 里面的命令是 sys tf(2,[1500,1],inputdelay,100) 得到 2 exp(-100*s) * ---------- 1500 s 1 2.求 Z域传递函数 dsy c2d(sys,10,z) % 10 为间隔采样时间 得到 0.01329 z^(…

matlab实现从s域变成z域、matlab实现长除法逆z变换实例

今天在复习微型计算机控制技术这门课时&#xff0c;感觉还是和当初学习时一样&#xff0c;计算量有点大。 主要是体现在&#xff1a;&#xff08;1&#xff09;、连续S域到离散Z域的变换。&#xff08;2&#xff09;、在画数字控制器和输出波形前对Y(z)和U(z)的长除法化简。 …

s域和z域变换笔记

连续函数 1、常见信号的拉普拉斯变换&#xff1a; 脉冲信号 δ&#xff08;t&#xff09;------------1 阶跃信号 μ&#xff08;t&#xff09;------------- 斜坡信号 t ------------------ 加速度信号 ---------------- 指数类信号 --------------- 正弦…

傅里叶变换(FS、FT、DTFT、DFT、DFS、FFT)、拉普拉斯变换和Z变换

傅里叶变换的目的&#xff1a;时域转为频域&#xff0c;滤波&#xff0c;求解微分方程等 1. FS&#xff08;Fourier Series&#xff09; 傅里叶级数&#xff1a;时域周期连续&#xff0c;频域离散。 前提&#xff1a;任何信号都可以看作是无限多的正弦波的叠加。 时域&#x…

Z变换

信号与系统的分析方法 可以分为两大类&#xff1a;时域分析和变换域分析 1.时域分析法&#xff1a; &#xff08;1&#xff09;连续时间信号与系统&#xff1a;信号的时域运算、分解&#xff0c;微分方程的经典解法&#xff1b;卷积积分 &#xff08;2&#xff09;离散时间…

matlab实现S域到Z域变换

传递函数如下: Z变换: 代码如下: %构造传递函数 h tf(10, [0.2 1 0]) %Z变换 zh c2d(h, 0.2,zoh) %得到分子分母系数 [num den] tfdata(zh, v) %得到零极点 [z, p, k] tf2zpk(num, den) 运行结果如下: h 10-----------0.2 s^2 sContinuous-time transfer functio…

S变换在特征提取中的使用

S变换 S变换采用高斯窗函数且窗宽与频率的倒数成正比&#xff0c;免去了窗函数的选择和改善了窗宽固定的缺陷&#xff0c;并且时频表示中各频率分量的相位谱与原始信号保持直接的联系&#xff0c;S变换具有良好的时频特性&#xff0c;适合用S变换对信号的一些时频与特征进行提取…

S变换

哈哈&#xff0c;这两天在整理时频分析的方法&#xff0c;大部分参考网上写的比较好的资料&#xff0c;浅显易懂&#xff0c;在这谢过各位大神了&#xff01; 今天准备写下S变换&#xff0c;由于网上资料较少&#xff0c;自己尝试总结下&#xff0c;学的不好&#xff0c;望各位…

S变化广义s变化和时频域特征-matlab

S变换(S-transform)最先出现是在1996年,由外国学者Stockwell提出,一般情况下,可以通俗的将S变换理解为小波变换和傅里叶变换的提升,充分弥补了傅里叶变换和小波变换所存在的不足之处,例如傅里叶变换的窗口尺度不可以随意改变,但是S变换就无此限制,与此同时,S变换还实…

S变换介绍(附代码)

1、S变换 作为小波变换和短时傅里叶变换的继承和发展&#xff0c; S 变换采用高斯窗函数且窗宽与频率的倒数成正比&#xff0c;免去了窗函数的选择和改善了窗宽固定的缺陷&#xff0c;并且时频表示中各频率分量的相位谱与原始信号保持直接的联系&#xff0c;使其在 PQD 分析中可…

S(Stockwell)变换的Matlab代码

S变换的Matlab代码 S变换简介Stockwell版S变换程序Dash版S变换程序博主自己编写的S变换主函数仿真结果 S变换简介 S变换&#xff0c;又称为Stockwell变换&#xff0c;由R. G. Stockwell于1996年提出。具体的定义如下&#xff1a; S变换在傅里叶域的表示形式为&#xff1a; 离…

如何进行支付功能的测试

非现金支付时代&#xff0c;非现金支付已经成为了生活不可或缺的一部分&#xff0c;我们只需要一台手机便可走遍全国各地&#xff08;前提是支付宝&#xff0c;微信有钱<00>&#xff09;,那么作为测试人员&#xff0c;支付测试也是非常重要的一环&#xff0c;那么下面我就…