大香蕉综合在线观看视频-日本在线观看免费福利-欧美激情一级欧美精品性-综合激情丁香久久狠狠

好房網(wǎng)

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

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

2022-07-17 18:18:00 常識百科來源:
導(dǎo)讀 想必現(xiàn)在有很多小伙伴對于Swift JSON 映射到對應(yīng)的model對象,有什么好的框架或?qū)嵺`方面的知識都比較想要了解,那么今天小好小編就為大...

想必現(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)系刪除!


標(biāo)簽:

最新文章:

熱點推薦
熱評文章
隨機(jī)文章