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