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

Posted

技术标签:

【中文标题】添加嵌套字典会导致 JSONSerialization 返回 nil【英文标题】:Adding nested dictionary causes JSONSerialization to return nil 【发布时间】:2019-07-21 10:09:00 【问题描述】:

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

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

代码:

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。

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

谢谢!

【问题讨论】:

您遇到的错误是什么? 【参考方案1】:

它作为一个键失败(这里是添加的 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]

【讨论】:

以上是关于添加嵌套字典会导致 JSONSerialization 返回 nil的主要内容,如果未能解决你的问题,请参考以下文章

将列表条目作为值更新为嵌套字典

在深度嵌套字典中添加所有值

Javascript:在嵌套字典中添加键/值对;键和值是变量

python 如何对嵌套字典里的数据进行添加和删除?

Python全栈day13(作业讲解字典嵌套实现用户输入添加及查看)

遍历嵌套字典以创建数据框并添加新的列值