swift - 添加嵌套字典导致 JSONSerialization 返回 nil

标签 swift nsjsonserialization jsonserializer

我有以下用于将 JSON 数据传递到 REST 端点的结构。最初该对象只包含一层键值对。在那种情况下,序列化为 JSON 对象工作正常。

现在我需要添加一个字典作为参数,它应该在生成的 JSON 中创建一个嵌套字典。但是,添加嵌套字典会导致 JSONSerialization 返回 nil。

代码:

struct ServicePayload:Codable {

    private var name:String
    private var type:String
    private var deviceId:String
    private var clientType:String
    private var appInstanceId:String
    private var version:String
    private var addParams:[String:String] // causes failure

    init(name:String, type:String, version:String, params:[String:String]) {
        self.name = name
        self.type = type
        self.deviceId = Constants.Device.identifier!
        self.version = version
        self.clientType = "1"
        self.appInstanceId = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
        self.addParams = params
    }

    // json mapper
    private enum CodingKeys:String, CodingKey {
        case name = "name"
        case type = "contentTypes"
        case deviceId = "x-DeviceId"
        case clientType = "x-ClientType"
        case appInstanceId = "x-InstanceId"
        case version = "version"
        case addParams = "optionalParams"
    }

    func getJsonObject() -> [String:String]? {
        do {
            let encoded = try JSONEncoder().encode(self)
            if let json = try JSONSerialization.jsonObject(with: encoded, options: []) as? [String : String] {
                return json
            }
        } catch (let error) {
            print("Error building JSON: \(error.localizedDescription)")
        }
        return nil
    }
}

如果没有 addParams 字段,JSONSerialization 将按预期工作。当我添加 addParams 字段(向对象添加嵌套字典)时,JSONSerialization 失败并返回 nil。

谁能告诉我为什么我不能在这种情况下添加嵌套字典?

谢谢!

最佳答案

它失败了,因为一个键(这里是添加的 addParams )的值不是 String 所以转换

 as? [String : String] // causes failure

不会发生,因此是 nil json,所以替换

if let json = try JSONSerialization.jsonObject(with: encoded, options: []) 
 as? [String : String] {

if let json = try JSONSerialization.jsonObject(with: encoded, options: []) 
 as? [String : Any] {

Any封装了String[String:String]

关于swift - 添加嵌套字典导致 JSONSerialization 返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54909673/

相关文章:

ios - 为什么在 swift 中数组声明的末尾需要大括号?

ios - 使用序列化程序时更改 json 输出

iphone - NSJSONSerialization Json 嵌套子

ios - 下载 JSON 文件后在 Swift 3 中解析 JSON,NSCocoaErrorDomain Code=3840

android - Android JSON 序列化器

cocoa-touch - 如何使用 Swift 在键盘出现时向上移动 UIViewController 的内容

ios - 如何将登录模块实现为我的 iOS 框架的一部分

swift - 为什么 Swift JSONDecodable 会失败?

c# - 无法将当前 JSON 数组(例如 [1,2,3])反序列化为具有复杂和嵌套对象的类型

swift -++ 后增量运算符的替代方案?