创建类和结构来表示Swift中的JSON对象

时间:2014-08-31 20:02:28

标签: ios json swift

我正在尝试创建与Swift中检索的JSON数据相对应的类。对于嵌套对象,是否适合通过结构而不是单独的类来表示它们?或者这些只是被视为字典对象?所以例如下面是一些JSON:

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

在Swift类中表示嵌套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中各自的类变量/结构。

2 个答案:

答案 0 :(得分:0)

将JSON中的本机NSDictionary对象传递到NSJSONSerialization class非常简单,如果在一个格式良好的NSDictionary对象中设置JSON表示,则可以反过来(即,您可以通过`dataWithJSONObject:options:error: API从NSDictonary对象创建JSON数据流。

公共文档适用于Objective-C,但如果您登录Apple的Developer Portal,您也可以查找预发布的Swift文档。

答案 1 :(得分:0)

我从this article获取灵感,创建了一个自定义JSON反序列化框架。

接下来,我要创建一个这样的界面:

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 {
        ...
    }
}