网站首页常识百科 >正文
想必现在有很多小伙伴对于Swift JSON 映射到对应的model对象,有什么好的框架或实践方面的知识都比较想要了解,那么今天小好小编就为大家收集了一些关于Swift JSON 映射到对应的model对象,有什么好的框架或实践方面的知识分享给大家,希望大家会喜欢哦。
1、可以用Perfect,在github上搜一下就知道了。
2、这个函数库内建json支持,而且有中文文档:
3、Docs/blob/master/guide.zh_CN/JSON.md
4、转过情载或者引样用本文内容四请注由明来源于芝士回答
5、JSON数据转换
6、这面量两平间变解代通,入回热报张验深率却满。
7、Perfect通过一系列Swift自建数据类型的扩展实现了基本的JSON编码和解码工具。解码是通过在Swift字符串类型基础上实现的扩展。
8、在产社原装际太族,存照。
9、请注意虽然Perfect的JSON工具功能强大,但对您的系统而言不是必须的,请根据需要自行选择引用该工具库内的函数。
10、如果需要使用本系统,请首先在您的源代码开始部分确保PerfectLib库函数已经声明导入:
11、import PerfectLib
12、将数据编码为JSON格式
13、您可以将以下数据类型直接转换为JSON字符串:
14、String 字符串
15、Int 整型
16、UInt 无符号整型
17、Double 双精度浮点型
18、Bool 布尔型
19、Array 任意类型的数组
20、Dictionary 以字符串为关键词的字典
21、Optional 可选类型
22、从JSONConvertibleObject对象继承而来的定制类型
23、⚠️注意⚠️对于可选类型而言,只有包含上述任意一种类型的Optional类型才是可以直接转换的。对于值为nil的Optionals类型来说,JSON字符串输出结果将会是"null"。
24、为了实现上述变量类型的编码,请调用上述对象的jsonEncodedString()函数。这个函数是Perfect专门做的扩展。该函数有可能会抛出JSONConversionError.notConvertible无法转换的异常。
25、举例
26、let scoreArray: [String:Any] = ["第一名": 300,"第二名": 230.45,"第三名": 150]
27、let encoded = try scoreArray.jsonEncodedString()
28、编码结果是如下字符串:
29、{"第二名":230.45,"第一名":300,"第三名":150}
30、解码JSON数据
31、包含JSON格式数据的字符串可以用jsonDecode()函数解码。如果格式有问题,该函数会抛出JSONConversionError.syntaxError语法错误异常。
32、let encoded ="{"第二名":230.45,"第一名":300,"第三名":150}"
33、let decoded = try encoded.jsonDecode() as? [String:Any]
34、对上述字符串的解码将会生成下列内容的字典类型:
35、["第二名": 230.44999999999999,"第一名": 300,"第三名": 150]
36、由于解码JSON字符串可能产生任意数据值,因此最常见的方法是用JSON对象(字典)或者数组进行处理。您需要根据结果自行按照预期类型进行转换。
37、解码后的数据使用
38、因为解码后的结果总是[String:Any]字典或者[Any]数组,因此您需要其包含的数据转换为预期类型,比如:
39、var firstPlace = 0
40、var secondPlace = 0.0
41、var thirdPlace = 0
42、let encoded ="{"第二名":230.45,"第一名":300,"第三名":150}"
43、guard let decoded = try encoded.jsonDecode() as? [String:Any] else {
44、return
45、}
46、for (key, value) in decoded {
47、switch key {
48、case"第一名":
49、firstPlace = value as! Int
50、case"第二名":
51、secondPlace = value as! Double
52、case"第三名":
53、thirdPlace = value as! Int
54、default:
55、break
56、}
57、}
58、print("前三名:r"+"第一名"+"(firstPlace)"+"分r"+"第二名:"+"(secondPlace)"+"分r"+"第三名:"+"(thirdPlace)"+"分")
59、输出结果为:
60、前三名:
61、第一名:300分
62、第二名:230.45分
63、第三名:150分
64、从JSON数据中解码空值
65、由于JSON的空值是没有类型的,系统会将空值替换为一个JSONConvertibleNull对象。比如:
66、let jsonString ="{"第一名":300,"第四名":null,"第二名":230.45,"第三名":150}"
67、if let decoded = try jsonString.jsonDecode() as? [String:Any] {
68、for (key, value) in decoded {
69、if let value as? JSONConvertibleNull {
70、print("字段"(key)"为空值")
71、}
72、}
73、}
74、输出为:
75、字段"第四名"为空值
76、可转换为JSON的对象
77、Perfect的JSON转换工具库提供为定制类的编码解码功能。只要从JSONConvertibleObject基类继承即可,如下示例:
78、/// 从基类继承为一个可以转化为JSON格式的定制对象。
79、public class JSONConvertibleObject: JSONConvertible {
80、/// 默认构造函数
81、public init() {}
82、/// 获得JSON键/值
83、public func setJSONValues(_ values:[String:Any]) {}
84、/// 根据JSON键/值设置对象属性。
85、public func getJSONValues() -> [String:Any] { return [String:Any]() }
86、/// 将对象编码为JSON文本
87、public func jsonEncodedString() throws -> String {
88、return try self.getJSONValues().jsonEncodedString()
89、}
90、}
91、任何需要使用JSON编解码的对象都首先要将该对象注册到系统中去。注册工作需要在您的应用程序启动时完成。调用JSONDecoding.registerJSONDecodable函数完成对象注册。该函数定义如下:
92、public class JSONDecoding {
93、/// 该函数为基于JSON成员数据定制对象返回一个新的实例。
94、public typealias JSONConvertibleObjectCreator = () ->JSONConvertibleObject
95、static public func registerJSONDecodable(name: String, creator: JSONConvertibleObjectCreator)
96、}
97、注册对象是需要一个唯一的命名。同样还需要一个creator函数用于在需要时创建一个新的对象实例。
98、当系统对一个JSONConvertibleObject对象编码时,会调用对象的getJSONValues函数。该函数会返回一个[String:Any]字典,该字典包含了用于给这个对象编码的所有的字段和属性值。这个字典必须要包含一个声明其对象类型的字段。而这个类型字段的值也 必须 是与该对象在程序开始阶段注册的名称一致的名字。对应该属性值的字段由JSONDecoding.objectIdentifierKey属性而定。
99、当系统解码这样一个对象时,系统会首先寻找JSONDecoding.objectIdentifierKey值,然后在查找之前注册的对象creator构造函数。随后系统会根据这个类型和构造函数自动创建一个新对象并调用setJSONValues(_ values:[String:Any]) 函数设置各字段值。调用该函数会用一个包含所有解码数据的字典作为参数传递过去。这些属性值会与之前由getJSONValues编码函数返回的内容进行匹配。在setJSONValues函数中,对象会恢复所有属性与数据。
100、下面的例子演示了如何定义一个定制的JSONConvertibleObject对象,以及如何将其转换为一个JSON字符串。然后再进行解码并与原对象进行比较。⚠️注意⚠️在本例子中对象通过调用getJSONValue函数直接把一个命名字段的属性值从字典中抽取出来,而且允许在字典内不包含指定字段的情况下返回一个默认值。
101、该例子分成了以下几个部分逐一说明。
102、类定义
103、class User: JSONConvertibleObject {
104、static let registerName ="user"
105、var firstName =""
106、var lastName =""
107、var age = 0
108、override func setJSONValues(_ values: [String : Any]) {
109、self.firstName = getJSONValue(named:"firstName", from: values, defaultValue:"")
110、self.lastName = getJSONValue(named:"lastName", from: values, defaultValue:"")
111、self.age = getJSONValue(named:"age", from: values, defaultValue: 0)
112、}
113、override func getJSONValues() -> [String : Any] {
114、return [
115、JSONDecoding.objectIdentifierKey:User.registerName,
116、"firstName":firstName,
117、"lastName":lastName,
118、"age":age
119、]
120、}
121、}
122、注册定义好的类信息
123、// 运行一次即可
124、JSONDecoding.registerJSONDecodable(name: User.registerName, creator: { return User() })
125、对象编码:
126、let user = User()
127、user.firstName ="Donnie"
128、user.lastName ="Darko"
129、user.age = 17
130、let encoded = try user.jsonEncodedString()
131、编码后的数据看起来像这样:
132、{"lastName":"Darko","age":17,"_jsonobjid":"user","firstName":"Donnie"}
133、对象解码:
134、guard let user2 = try encoded.jsonDecode() as? User else {
135、return // 出错
136、}
137、// 验证属性值是否一致
138、XCTAssert(user.firstName == user2.firstName)
139、XCTAssert(user.lastName == user2.lastName)
140、XCTAssert(user.age == user2.age)
141、JSON转换错误
142、在JSON编码解码过程中,系统可能会抛出一个JSONConversionError转换异常,定义如下:
143、/// 在JSON编解码过程中可能发生的错误异常。
144、public enum JSONConversionError: ErrorProtocol {
145、/// 对象不支持JSON转换。
146、case notConvertible(Any)
147、/// 提供的字段不是字符串。
148、case invalidKey(Any)
149、/// JSON文本内由语法错误。
150、case syntaxError
151、}
本文到此结束,希望对大家有所帮助。
版权说明:本文由用户上传,如有侵权请联系删除!
猜你喜欢:
- 2022-07-17带有虎字的四字成语大全(带有虎字的四个字的吉祥成语简介介绍)
- 2022-07-17考研招生单位是啥意思(考研招生单位是什么意思简介介绍)
- 2022-07-17腾势d9(teng滕组词)
- 2022-07-17华东交通大学理工学院最新消息(华东交通大学理工学院是个怎么样的学校)
- 2022-07-17无线网卡是什么怎么用(无线网卡是干什么用的简介介绍)
- 2022-07-17玫瑰花花瓣有什么作用(红玫瑰花瓣有什么用途简介介绍)
- 2022-07-17算术平均数的性质证明(算术平均数的性质是什么)
最新文章:
- 2022-07-172022年07月17日18时广安最新防疫防控出行返乡进入离开广安政策规定条件
- 2022-07-172022年07月17日18时宜宾最新防疫防控出行返乡进入离开宜宾政策规定条件
- 2022-07-172022年07月17日18时眉山最新防疫防控出行返乡进入离开眉山政策规定条件
- 2022-07-172022年07月17日18时南充最新防疫防控出行返乡进入离开南充政策规定条件
- 2022-07-172022年07月17日18时乐山最新防疫防控出行返乡进入离开乐山政策规定条件
- 2022-07-172022年07月17日18时内江最新防疫防控出行返乡进入离开内江政策规定条件
- 2022-07-172022年07月17日18时遂宁最新防疫防控出行返乡进入离开遂宁政策规定条件
- 2022-07-17集成显卡坏了的症状(集成显卡坏了怎么办简介介绍)
- 2022-07-172022年07月17日18时广元最新防疫防控出行返乡进入离开广元政策规定条件
- 2022-07-172022年07月17日18时绵阳最新防疫防控出行返乡进入离开绵阳政策规定条件
- 2022-07-172022年07月17日18时德阳最新防疫防控出行返乡进入离开德阳政策规定条件
- 2022-07-172022年07月17日18时泸州最新防疫防控出行返乡进入离开泸州政策规定条件
- 2022-07-172022年07月17日18时攀枝花最新防疫防控出行返乡进入离开攀枝花政策规定条件
- 2022-07-17新疆师范高等专科学校(新疆师范高等专科学校)
- 2022-07-172022年07月17日18时自贡最新防疫防控出行返乡进入离开自贡政策规定条件
- 热点推荐
- 热评文章