swift: Convert JSON to Model Object

JSON和第三方庫(kù)

用到的第三方庫(kù):

JSON示例:

{
    "author": [
        {
            "id": 6, 
            "name": "Gob Bluth"
        }, 
        {
            "id": 7, 
            "name": "7Gob Bluth"
        }
    ], 
    "text": "I've made a huge mistake.", 
    "comments": [
        {
            "author": {
                "id": 1, 
                "name": "Lucille"
            }, 
            "text": "Really? Did 'nothing' cancel?"
        }
    ]
}

JSON轉(zhuǎn)模型

在OC中,利用MJExtension等第三方庫(kù),我們能夠很方便的將JSON轉(zhuǎn)換為模型。

在swift中,就沒(méi)有這么方便了。因?yàn)闀?huì)有可選值(optional)類(lèi)型的影響。往往需要判斷是否是可選值,各種右移if let判斷,無(wú)法忍受。這里有篇文章 說(shuō)的很詳細(xì),還有對(duì)比當(dāng)前流行的庫(kù)的優(yōu)缺點(diǎn)。

SWIFT JSON SHOOT-OUT 文章鏈接

在swift中怎么進(jìn)行JSON轉(zhuǎn)模型操作呢?

  • 橋接ObjectiveC的MJExtension到swift中,進(jìn)行轉(zhuǎn)換操作
  • 使用swift版本的庫(kù)Argo,進(jìn)行轉(zhuǎn)換操作

橋接MJExtension到swift

大致步驟如下:

  • 創(chuàng)建繼承自NSObject的模型Model,橋接在swift項(xiàng)目里。
  • 用ESJsonFormat工具創(chuàng)建類(lèi)屬性。
  • 在swift中,進(jìn)行轉(zhuǎn)換。
//獲取JSON數(shù)據(jù),然后轉(zhuǎn)換
let filePath = NSBundle.mainBundle().pathForResource("data", ofType: "json")
let contentData = NSFileManager.defaultManager().contentsAtPath(filePath!)
let content = NSString(data: contentData!, encoding: NSUTF8StringEncoding) as? String
//JSON轉(zhuǎn)模型
let model = Model.mj_objectWithKeyValues(content)

print(model.ShopList[0].ShopInfo.develiyTime)

使用Argo庫(kù)

Argo庫(kù)用函數(shù)式方法來(lái)轉(zhuǎn)換。不過(guò)里面用到了許多操作符,咋看上去簡(jiǎn)直嚇?biāo)廊恕2贿^(guò)熟悉后就好了。

像這樣的:

struct Author {
    let id: Int
    let name: String
}

extension Author: Decodable {
    static func decode(json: JSON) -> Decoded<Author.DecodedType> {
        return curry(self.init)
            <^> json <| "id"
            <*> json <| "name"
    }
}

使用步驟:

  • 創(chuàng)建模型結(jié)構(gòu)體
  • 擴(kuò)展結(jié)構(gòu)體并遵守協(xié)議:Decodable,實(shí)現(xiàn)協(xié)議方法decode(json: JSON)。并映射對(duì)應(yīng)關(guān)系。

操作符說(shuō)明:

“<|” 映射字符值。含義是轉(zhuǎn)換<|右邊對(duì)應(yīng)的屬性名,屬性名是String的。如:
<^> json <| "id",映射JSON中的id字段為id屬性。
“<|?” 映射可選字符值。就是說(shuō)轉(zhuǎn)換過(guò)來(lái)的值有可能是null
"<^>" map,映射的意思。具體什么用的,不是很了解,不過(guò),一般擴(kuò)展方法中,它都是第一個(gè)。
“<*>” apply和上一個(gè)類(lèi)似。
“<||” 轉(zhuǎn)換數(shù)組。這個(gè)是轉(zhuǎn)換JSON中的數(shù)組值用的。如:JSON {"array":["1","2"]} ,轉(zhuǎn)換的話就是: <|| ["array"]
“<||?” 轉(zhuǎn)換的數(shù)組是可選值,有可能是null.

示例的JSON,用Argo轉(zhuǎn)換為模型的代碼,看起來(lái)有點(diǎn)多。

//SwiftModel.swfit中
import UIKit
import Argo
import Curry

struct Author {
    let id: Int
    let name: String
}

extension Author: Decodable {
    static func decode(json: JSON) -> Decoded<Author.DecodedType> {
        return curry(self.init)
            <^> json <| "id"
            <*> json <| "name"
    }
}

struct Comments {
    let author: Author
    let text: String
}

extension Comments: Decodable {
    static func decode(json: JSON) -> Decoded<Comments.DecodedType> {
        return curry(self.init)
            <^> json <| "author"
            <*> json <| "text"
    }
}

struct SwiftModel {
    let author: [Author]
    let text: String
    let comments: [Comments]
}

extension SwiftModel: Decodable {
    static func decode(json: JSON) -> Decoded<SwiftModel.DecodedType> {
        return curry(self.init)
            <^> json <|| ["author"]
            <*> json <| "text"
            <*> json <|| ["comments"]
    }
}

//viewController中
let json = JSONFromFile("data")
let argoModel: SwiftModel = json.flatMap(decode)!
print(argoModel.author[0].name)

樣例工程在這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自:https://github.com/Tim9Liu9/TimLiu-iOS[https://github...
    香橙柚子閱讀 9,177評(píng)論 0 36
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,704評(píng)論 4 61
  • 方位 物體的方位主要描述物體的朝向。在描述物體的位置的時(shí)候,是需要基于某個(gè)坐標(biāo)的參考點(diǎn)來(lái)描述物體的位移。而方位也一...
    Doter閱讀 1,160評(píng)論 0 0
  • 今晚曼城主場(chǎng)與切爾西的英超本輪焦點(diǎn)之戰(zhàn)以切爾西客場(chǎng)3:1取勝結(jié)束,此役過(guò)后,切爾西暫時(shí)把榜首的領(lǐng)先優(yōu)勢(shì)擴(kuò)大到了四...
    奮斗星人_小帆閱讀 299評(píng)論 0 0
  • 人活著,總有一些東西是永遠(yuǎn)無(wú)法割舍與忘懷的,比如說(shuō)友情。不管時(shí)光如何匆匆流去,我都記得你們。謝謝,有你們相伴每一程...
    慧發(fā)光的猴子閱讀 756評(píng)論 0 0

友情鏈接更多精彩內(nèi)容