2014-08-31 31 views
2

我試圖創建與Swift中檢索到的JSON數據對應的類。對於嵌套對象,是否適合通過結構而不是單獨的類來表示它們?還是應該將這些簡單地視爲字典對象?因此,例如,下面是一些JSON:創建類和結構體來表示Swift中的JSON對象

{ 
    prop1: value1, 
    prop2: { 
    subprop1: subvalue1, 
    subprop2: subvalue2 
    } 
} 

什麼是代表在斯威夫特類嵌套prop2對象的最佳方式?目前,我正在這樣做使用結構如下:

class MyClass { 
    struct prop2 { 
    var subprop1: AnyObject? 
    var subprop2: AnyObject? 
    } 

    var prop1: AnyObject? 
} 

這種方法就顯得有些繁瑣,但是,當有深層嵌套的對象,因此不能確定如何最好地處理這些情況。

我還要補充一點,我沒有問題的數據序列化爲NSDictonary對象,像這樣:

if let details: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary { } 

不過,我想進一步採取這一步驟和字典的屬性映射到它們各自的Swift中的類變量/結構體。

+1

結帳的[JSONModel項目](https://github.com/icanzilb/JSONModel#model-collections),它看起來不錯。 – zaph 2014-08-31 20:33:36

+0

完美!謝謝Zaph。 – 2014-08-31 20:38:26

+0

看起來很有趣,雖然在問題 – 2015-05-14 10:53:07

回答

0

將JSON的本機NSDictionary對象傳遞到NSJSONSerialization class中非常簡單,如果您在正確形成的NSDictionary對象中設置了JSON表示,則可以執行相反操作(即可以創建JSON數據流來自NSDictonary對象),通過`dataWithJSONObject:options:error: API。

公共文檔是針對Objective-C的,但如果您登錄到Apple的Developer Portal,還可以查看預發佈的Swift文檔。

+0

中沒有需要Swift支持謝謝邁克爾。我設法將JSON數據序列化爲NSDictionary對象,如下所示: if imageDetails:NSDictionary = NSJSONSerialization.JSONObjectWithData(data,options:NSJSONReadingOptions.MutableContainers,error:&err)as? NSDictionary 但是,這並不完全達到我所期望的100%。 – 2014-08-31 20:32:42

0

我創建了一個自定義的JSON反序列化框架,靈感來自this article

接下來,我會創建這樣一個接口:

protocol JsonDeserializable { 
    typealias T 
    class func deserialize(json: NSDictionary) -> T 
} 

,要麼類或結構的層次結構,避免嵌套的結構,從而使它們可重複使用:

struct MyStruct1 : JsonDeserializable { 
    var prop1: Type1 
    var prop2: MyStruct2 

    static func deserialize(json: NSDictionary) -> MyStruct1 { 
     ... 
    } 
} 

struct MyStruct2 : JsonDeserializable { 
    var subprop1: Subtype1 
    var subprop2: Subtype2 

    static func deserialize(json: NSDictionary) -> MyStruct2 { 
     ... 
    } 
} 
+0

這太棒了!謝謝! – 2014-08-31 23:03:49

+1

我已經擴展了該博客文章的想法,並創建了一個開源庫,您可能也想查看以下內容:https://github.com/isair/JSONHelper#json-string-deserialization 它甚至支持將JSON字符串直接反序列化到具有一行的對象(或仍然在一行中的對象數組)中。 – isair 2014-09-04 05:46:10