国产精品久久久久久久久久东京,久久精品亚洲国产,国产色呦呦,亚洲最大av网

好房網(wǎng)

網(wǎng)站首頁(yè)常識(shí)百科 >正文

Swift(JSON 映射到對(duì)應(yīng)的model對(duì)象有什么好的框架或?qū)嵺`)

2022-07-17 18:18:00 常識(shí)百科來(lái)源:
導(dǎo)讀 想必現(xiàn)在有很多小伙伴對(duì)于Swift JSON 映射到對(duì)應(yīng)的model對(duì)象,有什么好的框架或?qū)嵺`方面的知識(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)系刪除!


標(biāo)簽:

最新文章:

熱點(diǎn)推薦
熱評(píng)文章
隨機(jī)文章
国产成人精品久久亚洲高清不卡 | 国产亚洲欧美一区二区| 日韩精品电影网| 亚洲中文字幕无码久久2019| 人妻精品久久久a无码专区色视| 精品欧美国产一区二区三区不卡| 97在线看| 91视频久久久| 黑外教弄人妻波多野吉衣| 97人妻少妇| 蜜桃99视频一区二区三区| 在线免费av网| 精品久久网站| 99久久精品国产一区二区野战| 天天精品| 偷国产精品偷伦视频免费观看 | 熟妇搡bbbb搡bbbb泰国| 大香蕉久久久久久久| 国产成人av在线播放| 色综久久综合桃花网| 二区影院| 精品精品国产高清a毛片| 苍井空大战黑人巨大喷水| 成人手机在线视频| 偷拍久久精品视频| 欧美日韩国产亚洲乱码字幕| 久久免费综合| 久久久久久中文字幕无码| 性爱麻豆| 奶头又大又白喷奶水av动画| 免费一级全黄少妇性色生活片| 水蜜桃4小蜜桃4| 超碰1000| 男人的天堂久久| 久久尹人网| AV伊人久久| 精品人伦一区二区三区牛牛视频| 久久天天躁夜夜躁狠狠85麻豆| 爱干在线| 亚洲综合成人在线| 欧美精品亚洲精品日韩|