2016年7月28日 星期四

[Objective-C] JSONModel的使用方法

JSON是相當常見的資料交換格式,透過內建的NSJSONSerialization可以將JSON字串轉換成NSDictionary,在透過Key將Value讀出。

但通常我們不會直接使用這個NSDictionary,而是會在創建一個屬於此JSON資料的Model,使用Model來存取相關的屬性。

NSDictionary轉成Model在傳統的做法必須一層一層解析,程式碼較難維護,且因為人為的疏失可能會輸入錯誤的Key值,而導致一些不可預期的錯誤。

假設目前有個JSON資料如下











你可能會先創一個儲存這些資料的Class,例如



你一開始拿到的原始資料應該會是字串格式,透過NSJSONSerialization轉成NSDictionary,最後在把NSDictionary裡面的資料塞到你剛才創建的Class之中,你的程式碼看起來會像這個樣子。



你必須小心的確認Key有沒有打錯,還要依照不同的資料型態來做處理,若是多層的會寫許多的迴圈才有辦法將所有的JSON資料轉換成你建立的Model。

你可以透過一些第三方套件來完成這些事情,其中一個就是JSONModel。

https://github.com/jsonmodel/jsonmodel

直接下載或者使用CocoaPods將此套件加入到你的專案之中。

把你要儲存資料的Class,繼承JSONModel。



接著你只要將JSON字串塞到初始化之中,他就會將值塞到對應的屬性之中了。



除了字串以外,當然也可以使用字典來初始化(initWithDictionary)。

假如JSON有些屬性是不一定會回傳的,你要在你的屬性之中加入Optional。



這樣在你的JSON資料只有這些時,就不會發生問題。








此外,若是你這個屬性與JSON資料並不相關時,你可以在屬性之中加入Ignore。

JSON裡面有陣列,或者是又有其他的物件,也是可以處理的。

假設你的JSON資料如下。
















JSON資料中有個food的陣列,而陣列內容是另一個JSON物件,這時就要做特別的處理了。

任何是Array型態的Class,你必須在創建一個與該Class名稱一致的protocol,然後放到NSArray時,在NSArray裡面指定的資料型態是該protocol,而不是Class。

此時你的程式碼會像是這個樣子。



接著就可以使用JSONModel來塞入資料了



要拿出Food的內容,可以像上面的程式碼一樣,指定一個變數來存取,

但是有些人可能會想說怎麼不用 . 來存取,因為是資料型態是protocol,所以沒辦法用 . 來存取。

可是你可以使用類似方法的方式來存取屬性。



如此一來大部分的JSON資料應該都可以轉換成物件了,只是要注意如果是Array時的狀況即可,還有你創建的屬性名稱,必須與JSON的Key是一致的。