Добавление вложенного словаря заставляет JSONSerialization возвращать ноль - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть следующая структура, которая используется для передачи данных JSON в конечную точку REST.Первоначально объект содержал только один уровень пар ключ-значение.В этом случае сериализация в объект JSON сработала правильно.

Теперь мне нужно добавить словарь в качестве параметра, который должен создать вложенный словарь в результирующем JSON.Однако добавление вложенного словаря приводит к тому, что JSONSerialization возвращает ноль.

Код:

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 Ответ

0 голосов
/ 27 февраля 2019

Сбой как одного ключа (здесь это добавленное значение addParams) не является String, поэтому приведение

 as? [String : String] // causes failure

не произойдет, следовательно, ноль 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]

...