Swift 字典轉模型(KakaJSON) ---2.數(shù)據(jù)類型

由于JSON格式能表達的數(shù)據(jù)類型是比較有限的厨内,所以服務器返回的JSON數(shù)據(jù)有時無法自動轉換成客戶端想要的數(shù)據(jù)類型祈秕。

  • 比如服務器返回的時間可能是個毫秒數(shù)1565480696,但客戶端想要的是Date類型
  • 再比如客戶端想要的是浮點數(shù)Double類型雏胃,但服務器返回的可能是字符串類型"6.45"
  • 再比如客戶端想要的是Bool類型请毛,但服務器返回的可能是"true"、"1"瞭亮、0
  • 再比如客戶端想要的是高精度浮點數(shù)NSDecimalNumber類型方仿,服務器為了維持精度可能返回字符串"0.1234567890123456789"

1. Int

struct Student: Convertible {
    var age1: Int8 = 6
    var age2: Int16 = 0
    var age3: Int32 = 0
    var age4: Int64 = 0
    var age5: UInt8 = 0
    var age6: UInt16 = 0
    var age7: UInt32 = 0
    var age8: UInt64 = 0
    var age9: UInt = 0
    var age10: Int = 0
    var age11: Int = 0
}

let json: [String: Any] = [
    "age1": "suan8fa8",
    "age2": "6suan8fa8",
    "age3": "6",
    "age4": 6.66,
    "age5": NSNumber(value: 6.66),
    "age6": Int32(6),
    "age7": true,
    "age8": "FALSE",
    "age9": Decimal(6.66),
    "age10": NSDecimalNumber(value: 6.66),
    "age11": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("age1:\(student.age1)  age2:\(student.age2)  age3:\(student.age3)  age4:\(student.age4)  age5:\(student.age5)  age6:\(student.age6)  age7:\(student.age7)  age8:\(student.age8)  age9:\(student.age9)  age10:\(student.age10)  age11:\(student.age11)")
/*
age1:6  age2:6  age3:6  age4:6  age5:6  age6:6  age7:1  age8:0  age9:6  age10:6  age11:1565922866
*/

2. Float

struct Student: Convertible {
    var height1: Float = 0.0
    var height2: Float = 0.0
    var height3: Float = 0.0
    var height4: Float = 0.0
    var height5: Float = 0.0
    var height6: Float = 0.0
    var height7: Float = 0.0
    var height8: Float = 0.0
    var height9: Float = 0.0
}

let json: [String: Any] = [
    "height1": "6.66suan8fa8",
    "height2": "0.12345678",
    "height3": NSDecimalNumber(string: "0.12345678"),
    "height4": Decimal(string: "0.12345678") as Any,
    "height5": 666,
    "height6": true,
    "height7": "NO",
    "height8": CGFloat(0.12345678),
    "height9": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("height1:\(student.height1)  height2:\(student.height2)  height3:\(student.height3)  height4:\(student.height4)  height5:\(student.height5)  height6:\(student.height6)  height7:\(student.height7)  height8:\(student.height8)  height9:\(student.height9)")
/*
height1:6.66  height2:0.12345678  height3:0.12345678  height4:0.12345678  height5:666.0  height6:1.0  height7:0.0  height8:0.12345678  height9:1.5659228e+09
*/

3. Double

struct Student: Convertible {
    var height1: Double = 0.0
    var height2: Double = 0.0
    var height3: Double = 0.0
    var height4: Double = 0.0
    var height5: Double = 0.0
    var height6: Double = 0.0
    var height7: Double = 0.0
    var height8: Double = 0.0
    var height9: Double = 0.0
}

let json: [String: Any] = [
    "height1": "6.66suan8fa8",
    "height2": "0.1234567890123456",
    "height3": NSDecimalNumber(string: "0.1234567890123456"),
    "height4": Decimal(string: "0.1234567890123456") as Any,
    "height5": 666,
    "height6": true,
    "height7": "NO",
    "height8": CGFloat(0.1234567890123456),
    "height9": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("height1:\(student.height1)  height2:\(student.height2)  height3:\(student.height3)  height4:\(student.height4)  height5:\(student.height5)  height6:\(student.height6)  height7:\(student.height7)  height8:\(student.height8)  height9:\(student.height9)")
/*
height1:6.66  height2:0.1234567890123456  height3:0.1234567890123456  height4:0.1234567890123456  height5:666.0  height6:1.0  height7:0.0  height8:0.1234567890123456  height9:1565922866.0
*/

4. CGFloat

struct Student: Convertible {
    var height1: CGFloat = 0.0
    var height2: CGFloat = 0.0
    var height3: CGFloat = 0.0
    var height4: CGFloat = 0.0
    var height5: CGFloat = 0.0
    var height6: CGFloat = 0.0
    var height7: CGFloat = 0.0
    var height8: CGFloat = 0.0
    var height9: CGFloat = 0.0
}

let json: [String: Any] = [
    "height1": "6.66suan8fa8",
    "height2": "0.1234567890123456",
    "height3": NSDecimalNumber(string: "0.1234567890123456"),
    "height4": Decimal(string: "0.1234567890123456") as Any,
    "height5": 666,
    "height6": true,
    "height7": "NO",
    "height8": 0.1234567890123456,
    "height9": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("height1:\(student.height1)  height2:\(student.height2)  height3:\(student.height3)  height4:\(student.height4)  height5:\(student.height5)  height6:\(student.height6)  height7:\(student.height7)  height8:\(student.height8)  height9:\(student.height9)")
/*
height1:6.66  height2:0.1234567890123456  height3:0.1234567890123456  height4:0.1234567890123456  height5:666.0  height6:1.0  height7:0.0  height8:0.1234567890123456  height9:1565922866.0
*/

5. Bool

struct Student: Convertible {
    var rich1: Bool = false
    var rich2: Bool = false
    var rich3: Bool = false
    var rich4: Bool = false
    var rich5: Bool = false
    var rich6: Bool = false
}

let json: [String: Any] = [
    "rich1": 100,
    "rich2": 0.0,
    "rich3": "1",
    "rich4": NSNumber(value: 0.666),
    "rich5": "true",
    "rich6": "NO"
]

// 數(shù)值0為false,數(shù)值非0都是true
let student = json.kj.model(Student.self)
print("rich1:\(student.rich1)  rich2:\(student.rich2)  rich3:\(student.rich3)  rich4:\(student.rich4)  rich5:\(student.rich5)  rich6:\(student.rich6)")
/*
rich1:true  rich2:false  rich3:true  rich4:true  rich5:true  rich6:false
*/

6. String

// 不管是String、NSString仙蚜,還是NSMutableString此洲,都是等效支持的
struct Student: Convertible {
    var name1: String = ""
    var name2: String = ""
    var name3: NSString = ""
    var name4: NSString = ""
    var name5: NSMutableString = ""
    var name6: NSMutableString = ""
    var name7: String = ""
    var name8: String = ""
    var name9: String = ""
}

let json: [String: Any] = [
    "name1": 666,
    "name2": NSMutableString(string: "777"),
    "name3": [1,[2,3],"4"],
    "name4": NSDecimalNumber(string: "0.123456789012345678901234567890123456789"),
    "name5": 6.66,
    "name6": false,
    "name7": NSURL(fileURLWithPath: "/users/mj/desktop"),
    "name8": URL(string: "http://www.520suanfa.com") as Any,
    "name9": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("name1:\(student.name1)  name2:\(student.name2)  name3:\(student.name3)  name4:\(student.name4)  name5:\(student.name5)  name6:\(student.name6)  name7:\(student.name7)  name8:\(student.name8)  name9:\(student.name9)")
/*
name1:666  name2:777  name3:[1, [2, 3], "4"]  name4:0.123456789012345678901234567890123456789  name5:6.66  name6:false  name7:file:///users/mj/desktop  name8:http://www.520suanfa.com  name9:1565922866
*/

7. Decimal

struct Student: Convertible {
    var money1: Decimal = 0
    var money2: Decimal = 0
    var money3: Decimal = 0
    var money4: Decimal = 0
    var money5: Decimal = 0
    var money6: Decimal = 0
    var money7: Decimal = 0
    var money8: Decimal = 0
}

let json: [String: Any] = [
    "money1": 0.1234567890123456,
    "money2": true,
    "money3": NSDecimalNumber(string: "0.123456789012345678901234567890123456789"),
    "money4": "0.123456789012345678901234567890123456789",
    "money5": 666,
    "money6": "NO",
    "money7": CGFloat(0.1234567890123456),
    "money8": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("money1:\(student.money1)  money2:\(student.money2)  money3:\(student.money3)  money4:\(student.money4)  money5:\(student.money5)  money6:\(student.money6)  money7:\(student.money7)  money8:\(student.money8)")
/*
money1:0.1234567890123456  money2:1  money3:0.123456789012345678901234567890123456789  money4:0.123456789012345678901234567890123456789  money5:666  money6:0  money7:0.1234567890123456  money8:1565922866
*/

8. NSDecimalNumber

struct Student: Convertible {
    var money1: NSDecimalNumber = 0
    var money2: NSDecimalNumber = 0
    var money3: NSDecimalNumber = 0
    var money4: NSDecimalNumber = 0
    var money5: NSDecimalNumber = 0
    var money6: NSDecimalNumber = 0
    var money7: NSDecimalNumber = 0
    var money8: NSDecimalNumber = 0
}

let json: [String: Any] = [
    "money1": 0.1234567890123456,
    "money2": true,
    "money3": Decimal(string: "0.123456789012345678901234567890123456789") as Any,
    "money4": "0.123456789012345678901234567890123456789",
    "money5": 666.0,
    "money6": "NO",
    "money7": CGFloat(0.1234567890123456),
    "money8": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("money1:\(student.money1)  money2:\(student.money2)  money3:\(student.money3)  money4:\(student.money4)  money5:\(student.money5)  money6:\(student.money6)  money7:\(student.money7)  money8:\(student.money8)")
/*
money1:0.1234567890123456  money2:1  money3:0.123456789012345678901234567890123456789  money4:0.123456789012345678901234567890123456789  money5:666  money6:0  money7:0.1234567890123456  money8:1565922866
*/

9. NSNumber

struct Student: Convertible {
    var money1: NSNumber = 0
    var money2: NSNumber = 0
    var money3: NSNumber = 0
    var money4: NSNumber = 0
    var money5: NSNumber = 0
    var money6: NSNumber = 0
    var money7: NSNumber = 0
    var money8: NSNumber = 0
}

let json: [String: Any] = [
    "money1": 0.1234567890123456,
    "money2": true,
    "money3": Decimal(string: "0.1234567890123456") as Any,
    "money4": "0.1234567890123456",
    "money5": 666.0,
    "money6": "NO",
    "money7": CGFloat(0.1234567890123456),
    "money8": Date(timeIntervalSince1970: 1565922866)
]

let student = json.kj.model(Student.self)
print("money1:\(student.money1)  money2:\(student.money2)  money3:\(student.money3)  money4:\(student.money4)  money5:\(student.money5)  money6:\(student.money6)  money7:\(student.money7)  money8:\(student.money8)")
/*
money1:0.1234567890123456  money2:1  money3:0.1234567890123456  money4:0.1234567890123456  money5:666  money6:0  money7:0.1234567890123456  money8:1565922866
*/

10. URL

// 支持URL和NSURL,默認會將String轉為URL\NSURL

struct Student: Convertible {
    var url1: NSURL?
    var url2: NSURL?
    var url3: URL?
    var url4: URL?
}

let url = "http://520suanfa.com/紅黑樹"
let encodedUrl = "http://520suanfa.com/%E7%BA%A2%E9%BB%91%E6%A0%91"

let json: [String: Any] = [
    "url1": url,
    "url2": URL(string: encodedUrl) as Any,
    "url3": url,
    "url4": NSURL(string: encodedUrl) as Any
]

let student = json.kj.model(Student.self)
print("url1:\(student.url1!)  url2:\(student.url2!)  url3:\(student.url3!)  url4:\(student.url4!)")
/*
url1:http://520suanfa.com/%E7%BA%A2%E9%BB%91%E6%A0%91  url2:http://520suanfa.com/%E7%BA%A2%E9%BB%91%E6%A0%91  url3:http://520suanfa.com/%E7%BA%A2%E9%BB%91%E6%A0%91  url4:http://520suanfa.com/%E7%BA%A2%E9%BB%91%E6%A0%91
*/

11. Date

// 支持Date和NSDate委粉,默認會將秒數(shù)轉為Date\NSDate
struct Student: Convertible {
    var date1: NSDate?
    var date2: NSDate?
    var date3: Date?
    var date4: Date?
    var date5: Date?
    var date6: Date?
    var date7: Date?
}

let milliseconds: TimeInterval = 1565922866

let json: [String: Any] = [
    "date1": milliseconds,
    "date2": Date(timeIntervalSince1970: milliseconds),
    "date3": milliseconds,
    "date4": NSDate(timeIntervalSince1970: milliseconds),
    "date5": "\(milliseconds)",
    "date6": NSDecimalNumber(string: "\(milliseconds)"),
    "date7": Decimal(string: "\(milliseconds)") as Any
]

let student = json.kj.model(Student.self)
print("date1:\(student.date1!)  date2:\(student.date2!)  date3:\(student.date3!)  date4:\(student.date4!)  date5:\(student.date5!)  date6:\(student.date6!)  date7:\(student.date7!)")
/*
date1:2019-08-16 02:34:26 +0000  date2:2019-08-16 02:34:26 +0000  date3:2019-08-16 02:34:26 +0000  date4:2019-08-16 02:34:26 +0000  date5:2019-08-16 02:34:26 +0000  date6:2019-08-16 02:34:26 +0000  date7:2019-08-16 02:34:26 +0000
*/

12. Enum

// 遵守一下ConvertibleEnum協(xié)議即可支持帶有RawValue的Enum類型

enum Grade: String, ConvertibleEnum {
    case perfect = "A"
    case great = "B"
    case good = "C"
    case bad = "D"
}

struct Student: Convertible {
    var grade1: Grade = .perfect
    var grade2: Grade = .perfect
}

let json: [String: Any] = [
    "grade1": "C",
    "grade2": "D"
]

let student = json.kj.model(Student.self)
print("grade1:\(student.grade1.rawValue)  grade2:\(student.grade2)")
// grade1:C  grade2:bad

/**********************************************/

// 換個浮點數(shù)試試
enum Grade2: Double, ConvertibleEnum {
    case perfect = 8.88
    case great = 7.77
    case good = 6.66
    case bad = 5.55
}

struct Student2: Convertible {
    var grade1: Grade2 = .perfect
    var grade2: Grade2 = .perfect
    var grade3: Grade2 = .perfect
    var grade4: Grade2 = .perfect
}

let json: [String: Any] = [
    "grade1": "5.55kaka",
    "grade2": 6.66,
    "grade3": NSNumber(value: 7.77),
    "grade4": NSDecimalNumber(string: "8.88")
]

let student = json.kj.model(Student2.self)
print("grade1:\(student.grade1)  grade2:\(student.grade2)  grade3:\(student.grade3)  grade4:\(student.grade4)")
// grade1:bad  grade2:good  grade3:great  grade4:perfect

13. Array

// 支持Array呜师、NSArray、NSMutableArray與Set贾节、NSSet汁汗、NSMutableSet之間自動轉換

struct Person: Convertible {
    var array1: [Int]?
    var array2: NSArray?
    var array3: NSMutableArray?
    var array4: [Int]?
    var array5: NSArray?
    var array6: NSMutableArray?
}

let array = [1, 2, 3]

let json: [String: Any] = [
    "array1": NSMutableArray(array: array),
    "array2": array,
    "array3": array,
    "array4": NSMutableSet(array: array),
    "array5": NSSet(array: array),
    "array6": Set(array),
]

let person = json.kj.model(Person.self)
print("array1:\(person.array1!)  array2:\(person.array2!)  array3:\(person.array3!)  array4:\(person.array4!)  array5:\(person.array5!)  array6:\(person.array6!)")
/*
array1:[1, 2, 3]  array2:(
    1,
    2,
    3
)  array3:(
    1,
    2,
    3
)  array4:[3, 1, 2]  array5:(
    3,
    1,
    2
)  array6:(
    3,
    1,
    2
)
*/

14. Dictionary

// 支持Dictionary、NSDictionary栗涂、NSMutableDictionary之間自動轉換

struct Person: Convertible {
    var dict1: [String: Any]?
    var dict2: NSDictionary?
    var dict3: NSMutableDictionary?
}

let dict = ["no1": 100, "no2": 200]

let json: [String: Any] = [
    "dict1": NSMutableDictionary(dictionary: dict),
    "dict2": dict,
    "dict3": dict
]

let person = json.kj.model(Person.self)
print("dict1:\(person.dict1!)  dict2:\(person.dict2!)  dict3:\(person.dict3!)")
/*
dict1:["no1": 100, "no2": 200]  dict2:{
    no1 = 100;
    no2 = 200;
}  dict3:{
    no1 = 100;
    no2 = 200;
}
*/

Swift 字典轉模型(KakaJSON) ---1.基本用法
Swift 字典轉模型(KakaJSON) ---3.key處理
Swift 字典轉模型(KakaJSON) ---4.動態(tài)模型
Swift KakaJSON 05.---模型轉字典
Swift KakaJSON 06.---Coding/歸檔/解檔

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末知牌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子斤程,更是在濱河造成了極大的恐慌角寸,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忿墅,死亡現(xiàn)場離奇詭異扁藕,居然都是意外死亡,警方通過查閱死者的電腦和手機球匕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門纹磺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來帖烘,“玉大人亮曹,你說我怎么就攤上這事∶刂ⅲ” “怎么了照卦?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長乡摹。 經常有香客問我役耕,道長,這世上最難降的妖魔是什么聪廉? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任瞬痘,我火速辦了婚禮,結果婚禮上板熊,老公的妹妹穿的比我還像新娘框全。我一直安慰自己,他們只是感情好干签,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布津辩。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喘沿。 梳的紋絲不亂的頭發(fā)上闸度,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音蚜印,去河邊找鬼莺禁。 笑死,一個胖子當著我的面吹牛晒哄,可吹牛的內容都是我干的睁宰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼寝凌,長吁一口氣:“原來是場噩夢啊……” “哼柒傻!你這毒婦竟也來了?” 一聲冷哼從身側響起较木,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤红符,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伐债,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體预侯,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年峰锁,在試婚紗的時候發(fā)現(xiàn)自己被綠了萎馅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡虹蒋,死狀恐怖糜芳,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情魄衅,我是刑警寧澤峭竣,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站晃虫,受9級特大地震影響皆撩,放射性物質發(fā)生泄漏。R本人自食惡果不足惜哲银,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一扛吞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荆责,春花似錦滥比、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽型酥。三九已至,卻和暖如春查乒,著一層夾襖步出監(jiān)牢的瞬間弥喉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工玛迄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留由境,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓蓖议,卻偏偏與公主長得像虏杰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子勒虾,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容