在 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 对象的主要内容,如果未能解决你的问题,请参考以下文章