我有以下结构,用于将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
)的值不是aString
,所以
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/