2014-08-31 33 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