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

Posted

技术标签:

【中文标题】在 Swift 中创建类和结构来表示 JSON 对象【英文标题】:Create classes and structs to represent JSON objects in Swift 【发布时间】: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 支持 【参考方案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 字符串直接反序列化为一行对象(或仍然在一行中的一组对象)。

以上是关于在 Swift 中创建类和结构来表示 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

在层次结构中创建类的指针数组

Swift的闭包,枚举,类和结构体

在另一个类中创建类实例的问题

Swift中类和结构体

Swift 根据响应类型为 JSON 字段值动态选择 Codable 结构

c++ - 在函数中创建类实例并稍后使用