【问题标题】:Serializing Foundation and non-foundation types to JSON in swift快速将基础和非基础类型序列化为 JSON
【发布时间】:2021-01-17 06:56:06
【问题描述】:

我正在尝试将两种不同类型的对象序列化为JSON,但我只能将JSONEncoder 用于一种,将JSONSerialization 用于另一种。

一个是简单的Int,我序列化如下:

let ticket: [String:Any] = ["ticket": -1]
let ticketJson = try! JSONSerialization.data(withJSONObject: ticket)
let ticketJsonString = String(data: ticketJson, encoding: String.Encoding.utf8)

另一个对象类型是我创建的一个类,我序列化如下:

let encodedNotification = try! JSONEncoder().encode(notification)
let encodedNotificationJsonString = String(data: encodedNotification, encoding: String.Encoding.utf8)

理想情况下,我会使用以下字典同时序列化两者:

let parameters: [String:Any] = ["ticket": -1, "notification": notification]

这可能吗?如果是这样,怎么做?一直没搞清楚。

谢谢!

【问题讨论】:

    标签: ios json swift nsjsonserialization jsonencoder


    【解决方案1】:

    将值放入结构而不是[String: Any]

    struct Parameters: Encodable {
        let ticket: Int
        let notification: Notification
    }
    
    let parameters = Parameters(ticket: -1, notification: notification)
    
    let encoded = try JSONEncoder().encode(parameters)
    

    通常,避免在 Swift 中使用 Any。这是一种很难正确使用的类型,并且不能很好地与类型系统配合使用。除了在相当高级的代码中,它主要是由于 ObjC 桥接而出现的(例如在 JSONSerialization 中,它是 ObjC NSJSONSerialization 的桥梁)。

    【讨论】:

    • 谢谢。我怎么没想到呢? :( 无论如何,如果我在用于创建请求的函数中创建结构,会有什么问题吗?
    • 这完全是好的做法。您可以创建单个函数私有的本地结构类型。与局部变量一样,它甚至可以与您在其他函数中使用的局部结构同名,而不会引起冲突。
    猜你喜欢
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-26
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多