JSONNeverDie 使用指南

KryBatman 8年前發布 | 5K 次閱讀 iOS開發 移動開發

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-使用指南/

 本文由用戶 KryBatman 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!