JSONNeverDie 使用指南
JSONNeverDie 是一個 Swift 寫的 JSON 編碼、解碼庫,利用反射實現 JSON 到 Model 的自動映射,無需任何 parse 代碼,強大而簡單。
JSONNeverDie 可以采用“子項目”或者“源代碼”兩種方式引入,本人更推薦前者,更好更新。以及,非常重要的一點,也是我做純 Swift 開發兩年以來(正好到今天兩年整哈哈)的最佳實踐:在 Swift 時代,一切包管理工具都是累贅,手動使用 git 管理依賴的第三方工程是最好的。
One more thing
多說一句,CocoaPods 這樣的侵入性工具,我一開始就是拒絕的,經過這兩年 Swift 翻天覆地的變化,想必各位都有了豐富的包管理工具蛋疼經歷,此事就按下不表啦。
JSONNeverDie 在 2015年9月27日 發布了 0.1 版本,當時我所在的公司在開發一個 HTML5 小游戲平臺,APP 中有許多的 model ,每一個都有許多的字段,寫了一大堆 parse 代碼的我感到一絲淡淡的憂傷:要是能夠自動從 JSON 字符串映射到 model 字段就好了!加上 SwiftyJSON 有一些歷史遺留問題,在處理過長非 JSON 字符時有偶發性閃退(若愚兄不要打我,來北京陪你喝酒),我便自己開發了這個 JSON 處理庫。
15年底,按照計劃,我離開了上家創業公司加入了住范兒,開始了為期 10 個月的“唯一程序員”生涯(10個月以后就有同伴啦)。剛開始,住范兒還處在找方向的階段,快速開發可用原型成了我的首要工作,而當我第一次在全新 APP 中使用 JSONNeverDie 的自動映射功能的時候,我自己都要被自己感動哭了,簡直太TM好用了!
后來,每做一個原型我就感動一次,有一天我突然明白,這個項目的使用示例太少了,嚴重阻礙了大家來用它,然后我就保留了這個信念直到今天,終于要付諸行動了,好開心!
基本架構
JSONNeverDie 只有兩個元數據結構:struct JSONND 和 class JSONNDModel,分別對應 JSON 對象和 Model 對象。前者為值類型,完全的 Swift Style,主要用于 json[“key”].int 這類的嵌套取值及類型轉換,后者用于 Model 字段的自動映射,被迫使用了 class,繼承了 NSObject。
JSONND 的使用
你可以使用字符串生成 JSONND 對象以便進行取值:
let jsonFromString = JSONND(string: "{\"name\": \"JohnLui\"}")
也可以使用 Array 或 Dictionary 生成 JSONND 對象以便得到 JSON 字符串:
let jsonFromArray = JSONND(array: ["love", "you", "guys"])
let jsonFromDictionary = JSONND(dictionary: ["love": ["you": "guys"]])
print(jsonFromArray.RAWValue)
print(jsonFromDictionary.RAWValue)
JSONNeverDie 之前支持從 Data 初始化,后來我想了想,這樣太容易迷惑使用者。在跟 Pitaya 配合時,實際上 Pitaya 拿到的數據是 Data,首先被轉換成了 String,再在 JSONNeverDie 內部被轉換成 Data,最終生成 JSONND 對象,我認為這個性能損失是非常有價值的。我時刻謹記:代碼是寫給人看的,只是恰好能運行。同樣,我的庫是寫給人用的,不是寫來讓機器跑的。
JSONNDModel 的使用
簡單上手
我們使用上面生成的 jsonFromString 對象作為數據源,先定義 Model 類:
class People: JSONNDModel{
var name = ""
}
然后直接使用 JSONND 對象初始化這個類:
let people = People(JSONNDObject: json)
print(people.name) // get "JohnLui"
That’s it!
手動處理 Model 里屬性名稱和 JSON 中 key 值不一致的情況
class Good : JSONNDModel{
var des = ""
override init(JSONNDObject json: JSONND) {
// 記得要先調用父類的初始化
// 自動映射實際上是在這一步完成的
super.init(JSONNDObject: json)
// 再獲取你想要的字段并賦值
// 此時可隨意修改 Model 類
self.des = json["description"].stringValue
}
}
需要注意的點
類型
JSON 標準支持四種基礎類型和兩種結構類型:
JSON can represent four primitive types (strings, numbers, booleans,
and null) and two structured types (objects and arrays).
這反映在 Swift 中就是 String、Int、Double、Bool、nil、Dictionary、Array。
自動映射唯一的要求
那就是要有初始值。有了初始值才會真正的分配內存空間,才能做到類型探測,才能自動映射。
Array 類型怎么辦?
能怎么辦?手動搞唄:
class TestModel: JSONNDModel{
var string = ""
var double = 0.0
var int = 0
var array_values = [Int]()
override init(JSONNDObject json: JSONND) {
// 完成 string double int 三個屬性的自動映射
super.init(JSONNDObject: json)
// 手動完成數組賦值
for i in json["array_values"].arrayValue {
self.array_values.append(i.intValue)
}
}
}
JSONNDModel 對象嵌套?
手動搞,沒問題,還支持嵌套對象數組呢:
class TestModel: JSONNDModel{
var string = ""
var double = 0.0
var int = 0
// 普通數組
var array_values = [Int]()
// 文藝數組
var array = [ModelOnlyOneKey]()
// 二逼...不對,是普通對象
var hey: Hey!
override init(JSONNDObject json: JSONND) {
super.init(JSONNDObject: json)
for i in json["array_values"].arrayValue {
self.array_values.append(i.intValue)
}
for i in json["array"].arrayValue {
self.array.append(ModelOnlyOneKey(JSONNDObject: i))
}
self.hey = Hey(JSONNDObject: json["hey"])
}
}
來自:https://autolayout.club/2016/12/17/JSONNeverDie-使用指南/