【问题标题】:Create classes and structs to represent JSON objects in Swift在 Swift 中创建类和结构来表示 JSON 对象
【发布时间】:2014-08-31 20:02:28
【问题描述】:

我正在尝试创建与在 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?
}

这种方法有点麻烦,但是,当对象嵌套很深时,不知道如何最好地处理这些情况。

我还要补充一点,将数据序列化为 NSDictionary 对象没有问题,如下所示:

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

不过,我正试图更进一步,将字典的属性映射到它们各自在 Swift 中的类变量/结构。

【问题讨论】:

  • 查看JSONModel Project,看起来不错。
  • 完美!谢谢扎夫。
  • 看起来很有趣,尽管问题中没有 Swift 支持

标签: ios json swift


【解决方案1】:

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

公开文档是针对 Objective-C 的,但如果您登录 Apple 的开发者门户,您也可以查看预发布的 Swift 文档。

【讨论】:

  • 谢谢迈克尔。我已经设法将 JSON 数据序列化到 NSDictionary 对象中: if let imageDetails: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &err) as? NSDictionary 然而,这并不能完全完成我正在寻找的 100%。
【解决方案2】:

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

【讨论】:

  • 这太棒了!谢谢!
  • 我已经扩展了该博客文章中的想法并创建了一个开源库,您可能还想查看它:github.com/isair/JSONHelper#json-string-deserialization 它甚至支持将 JSON 字符串直接反序列化为一行对象(或仍然在一行中的一组对象)。
猜你喜欢
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2019-10-28
  • 2016-05-03
相关资源
最近更新 更多