網(wǎng)站首頁常識百科 >正文
想必現(xiàn)在有很多小伙伴對于Swift JSON 映射到對應(yīng)的model對象,有什么好的框架或?qū)嵺`方面的知識都比較想要了解,那么今天小好小編就為大家收集了一些關(guān)于Swift JSON 映射到對應(yīng)的model對象,有什么好的框架或?qū)嵺`方面的知識分享給大家,希望大家會喜歡哦。
1、可以用Perfect,在github上搜一下就知道了。
2、這個函數(shù)庫內(nèi)建json支持,而且有中文文檔:
3、Docs/blob/master/guide.zh_CN/JSON.md
4、轉(zhuǎn)過情載或者引樣用本文內(nèi)容四請注由明來源于芝士回答
5、JSON數(shù)據(jù)轉(zhuǎn)換
6、這面量兩平間變解代通,入回?zé)釄髲堯炆盥蕝s滿。
7、Perfect通過一系列Swift自建數(shù)據(jù)類型的擴(kuò)展實現(xiàn)了基本的JSON編碼和解碼工具。解碼是通過在Swift字符串類型基礎(chǔ)上實現(xiàn)的擴(kuò)展。
8、在產(chǎn)社原裝際太族,存照。
9、請注意雖然Perfect的JSON工具功能強(qiáng)大,但對您的系統(tǒng)而言不是必須的,請根據(jù)需要自行選擇引用該工具庫內(nèi)的函數(shù)。
10、如果需要使用本系統(tǒng),請首先在您的源代碼開始部分確保PerfectLib庫函數(shù)已經(jīng)聲明導(dǎo)入:
11、import PerfectLib
12、將數(shù)據(jù)編碼為JSON格式
13、您可以將以下數(shù)據(jù)類型直接轉(zhuǎn)換為JSON字符串:
14、String 字符串
15、Int 整型
16、UInt 無符號整型
17、Double 雙精度浮點型
18、Bool 布爾型
19、Array 任意類型的數(shù)組
20、Dictionary 以字符串為關(guān)鍵詞的字典
21、Optional 可選類型
22、從JSONConvertibleObject對象繼承而來的定制類型
23、??注意??對于可選類型而言,只有包含上述任意一種類型的Optional類型才是可以直接轉(zhuǎn)換的。對于值為nil的Optionals類型來說,JSON字符串輸出結(jié)果將會是"null"。
24、為了實現(xiàn)上述變量類型的編碼,請調(diào)用上述對象的jsonEncodedString()函數(shù)。這個函數(shù)是Perfect專門做的擴(kuò)展。該函數(shù)有可能會拋出JSONConversionError.notConvertible無法轉(zhuǎn)換的異常。
25、舉例
26、let scoreArray: [String:Any] = ["第一名": 300,"第二名": 230.45,"第三名": 150]
27、let encoded = try scoreArray.jsonEncodedString()
28、編碼結(jié)果是如下字符串:
29、{"第二名":230.45,"第一名":300,"第三名":150}
30、解碼JSON數(shù)據(jù)
31、包含JSON格式數(shù)據(jù)的字符串可以用jsonDecode()函數(shù)解碼。如果格式有問題,該函數(shù)會拋出JSONConversionError.syntaxError語法錯誤異常。
32、let encoded ="{"第二名":230.45,"第一名":300,"第三名":150}"
33、let decoded = try encoded.jsonDecode() as? [String:Any]
34、對上述字符串的解碼將會生成下列內(nèi)容的字典類型:
35、["第二名": 230.44999999999999,"第一名": 300,"第三名": 150]
36、由于解碼JSON字符串可能產(chǎn)生任意數(shù)據(jù)值,因此最常見的方法是用JSON對象(字典)或者數(shù)組進(jìn)行處理。您需要根據(jù)結(jié)果自行按照預(yù)期類型進(jìn)行轉(zhuǎn)換。
37、解碼后的數(shù)據(jù)使用
38、因為解碼后的結(jié)果總是[String:Any]字典或者[Any]數(shù)組,因此您需要其包含的數(shù)據(jù)轉(zhuǎn)換為預(yù)期類型,比如:
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、輸出結(jié)果為:
60、前三名:
61、第一名:300分
62、第二名:230.45分
63、第三名:150分
64、從JSON數(shù)據(jù)中解碼空值
65、由于JSON的空值是沒有類型的,系統(tǒng)會將空值替換為一個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、可轉(zhuǎn)換為JSON的對象
77、Perfect的JSON轉(zhuǎn)換工具庫提供為定制類的編碼解碼功能。只要從JSONConvertibleObject基類繼承即可,如下示例:
78、/// 從基類繼承為一個可以轉(zhuǎn)化為JSON格式的定制對象。
79、public class JSONConvertibleObject: JSONConvertible {
80、/// 默認(rèn)構(gòu)造函數(shù)
81、public init() {}
82、/// 獲得JSON鍵/值
83、public func setJSONValues(_ values:[String:Any]) {}
84、/// 根據(jù)JSON鍵/值設(shè)置對象屬性。
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編解碼的對象都首先要將該對象注冊到系統(tǒng)中去。注冊工作需要在您的應(yīng)用程序啟動時完成。調(diào)用JSONDecoding.registerJSONDecodable函數(shù)完成對象注冊。該函數(shù)定義如下:
92、public class JSONDecoding {
93、/// 該函數(shù)為基于JSON成員數(shù)據(jù)定制對象返回一個新的實例。
94、public typealias JSONConvertibleObjectCreator = () ->JSONConvertibleObject
95、static public func registerJSONDecodable(name: String, creator: JSONConvertibleObjectCreator)
96、}
97、注冊對象是需要一個唯一的命名。同樣還需要一個creator函數(shù)用于在需要時創(chuàng)建一個新的對象實例。
98、當(dāng)系統(tǒng)對一個JSONConvertibleObject對象編碼時,會調(diào)用對象的getJSONValues函數(shù)。該函數(shù)會返回一個[String:Any]字典,該字典包含了用于給這個對象編碼的所有的字段和屬性值。這個字典必須要包含一個聲明其對象類型的字段。而這個類型字段的值也 必須 是與該對象在程序開始階段注冊的名稱一致的名字。對應(yīng)該屬性值的字段由JSONDecoding.objectIdentifierKey屬性而定。
99、當(dāng)系統(tǒng)解碼這樣一個對象時,系統(tǒng)會首先尋找JSONDecoding.objectIdentifierKey值,然后在查找之前注冊的對象creator構(gòu)造函數(shù)。隨后系統(tǒng)會根據(jù)這個類型和構(gòu)造函數(shù)自動創(chuàng)建一個新對象并調(diào)用setJSONValues(_ values:[String:Any]) 函數(shù)設(shè)置各字段值。調(diào)用該函數(shù)會用一個包含所有解碼數(shù)據(jù)的字典作為參數(shù)傳遞過去。這些屬性值會與之前由getJSONValues編碼函數(shù)返回的內(nèi)容進(jìn)行匹配。在setJSONValues函數(shù)中,對象會恢復(fù)所有屬性與數(shù)據(jù)。
100、下面的例子演示了如何定義一個定制的JSONConvertibleObject對象,以及如何將其轉(zhuǎn)換為一個JSON字符串。然后再進(jìn)行解碼并與原對象進(jìn)行比較。??注意??在本例子中對象通過調(diào)用getJSONValue函數(shù)直接把一個命名字段的屬性值從字典中抽取出來,而且允許在字典內(nèi)不包含指定字段的情況下返回一個默認(rèn)值。
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、編碼后的數(shù)據(jù)看起來像這樣:
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轉(zhuǎn)換錯誤
142、在JSON編碼解碼過程中,系統(tǒng)可能會拋出一個JSONConversionError轉(zhuǎn)換異常,定義如下:
143、/// 在JSON編解碼過程中可能發(fā)生的錯誤異常。
144、public enum JSONConversionError: ErrorProtocol {
145、/// 對象不支持JSON轉(zhuǎn)換。
146、case notConvertible(Any)
147、/// 提供的字段不是字符串。
148、case invalidKey(Any)
149、/// JSON文本內(nèi)由語法錯誤。
150、case syntaxError
151、}
本文到此結(jié)束,希望對大家有所幫助。
版權(quán)說明:本文由用戶上傳,如有侵權(quán)請聯(lián)系刪除!
猜你喜歡:
- 2022-07-17帶有虎字的四字成語大全(帶有虎字的四個字的吉祥成語簡介介紹)
- 2022-07-17考研招生單位是啥意思(考研招生單位是什么意思簡介介紹)
- 2022-07-17騰勢d9(teng滕組詞)
- 2022-07-17華東交通大學(xué)理工學(xué)院最新消息(華東交通大學(xué)理工學(xué)院是個怎么樣的學(xué)校)
- 2022-07-17無線網(wǎng)卡是什么怎么用(無線網(wǎng)卡是干什么用的簡介介紹)
- 2022-07-17玫瑰花花瓣有什么作用(紅玫瑰花瓣有什么用途簡介介紹)
- 2022-07-17算術(shù)平均數(shù)的性質(zhì)證明(算術(shù)平均數(shù)的性質(zhì)是什么)
最新文章:
- 2022-07-172022年07月17日18時廣安最新防疫防控出行返鄉(xiāng)進(jìn)入離開廣安政策規(guī)定條件
- 2022-07-172022年07月17日18時宜賓最新防疫防控出行返鄉(xiāng)進(jìn)入離開宜賓政策規(guī)定條件
- 2022-07-172022年07月17日18時眉山最新防疫防控出行返鄉(xiāng)進(jìn)入離開眉山政策規(guī)定條件
- 2022-07-172022年07月17日18時南充最新防疫防控出行返鄉(xiāng)進(jìn)入離開南充政策規(guī)定條件
- 2022-07-172022年07月17日18時樂山最新防疫防控出行返鄉(xiāng)進(jìn)入離開樂山政策規(guī)定條件
- 2022-07-172022年07月17日18時內(nèi)江最新防疫防控出行返鄉(xiāng)進(jìn)入離開內(nèi)江政策規(guī)定條件
- 2022-07-172022年07月17日18時遂寧最新防疫防控出行返鄉(xiāng)進(jìn)入離開遂寧政策規(guī)定條件
- 2022-07-17集成顯卡壞了的癥狀(集成顯卡壞了怎么辦簡介介紹)
- 2022-07-172022年07月17日18時廣元最新防疫防控出行返鄉(xiāng)進(jìn)入離開廣元政策規(guī)定條件
- 2022-07-172022年07月17日18時綿陽最新防疫防控出行返鄉(xiāng)進(jìn)入離開綿陽政策規(guī)定條件
- 2022-07-172022年07月17日18時德陽最新防疫防控出行返鄉(xiāng)進(jìn)入離開德陽政策規(guī)定條件
- 2022-07-172022年07月17日18時瀘州最新防疫防控出行返鄉(xiāng)進(jìn)入離開瀘州政策規(guī)定條件
- 2022-07-172022年07月17日18時攀枝花最新防疫防控出行返鄉(xiāng)進(jìn)入離開攀枝花政策規(guī)定條件
- 2022-07-17新疆師范高等??茖W(xué)校(新疆師范高等??茖W(xué)校)
- 2022-07-172022年07月17日18時自貢最新防疫防控出行返鄉(xiāng)進(jìn)入離開自貢政策規(guī)定條件
- 熱點推薦
- 熱評文章
- 隨機(jī)文章
- 騰勢d9(teng滕組詞)
- 華東交通大學(xué)理工學(xué)院最新消息(華東交通大學(xué)理工學(xué)院是個怎么樣的學(xué)校)
- 無線網(wǎng)卡是什么怎么用(無線網(wǎng)卡是干什么用的簡介介紹)
- 玫瑰花花瓣有什么作用(紅玫瑰花瓣有什么用途簡介介紹)
- 算術(shù)平均數(shù)的性質(zhì)證明(算術(shù)平均數(shù)的性質(zhì)是什么)
- 加勒比海盜中的美人魚是誰扮演的(加勒比海盜美人魚扮演者是誰簡介介紹)
- 北京理工大學(xué)珠海學(xué)院本科學(xué)費(北京理工大學(xué)珠海學(xué)院的學(xué)費是多少啊)
- 葛粉是用什么做的(葛粉是什么做的簡介介紹)
- 網(wǎng)上高考查分?jǐn)?shù)怎么查詢(急急高考在網(wǎng)上怎么查分?jǐn)?shù)了)
- 堪國蘭庫帕簡介(堪國蘭庫帕是哪里簡介介紹)