JSONSerialization сериализует словарь с неправильными типами

У меня проблемы с переводом моих моделей в словари. Мои модели наследуются от Codable и при использовании JSONSerialization я получаю словарь вида:

(...,"sensors": <__NSArrayI 0x1105324f0>( {
accx = "-0.002471923828125";
accy = "0.011444091796875";
accz = "-1.013595581054688";
gyrox = "-0.029818882093399213";
gyroy = "0.028939506301455049";
gyroz = "0.0044943506556177227"; }, ...)  

(Обратите внимание, что мои ключи не в виде строки, а в виде значений)

когда на самом деле хочу этого:

(..., "sensors": [ {
"accx" = -0.002471923828125;
"accy" = 0.011444091796875;
"accz" = -1.013595581054688;
"gyrox" = -0.029818882093399213;
"gyroy" = 0.028939506301455049;
"gyroz" = 0.0044943506556177227;} ], ... )

Мои модели:

class Event: NSObject, Codable {

var latitude: Double?
var longitude: Double?
var speed: Double?
var date: String?
var type: String?
var sensors: [Sensor] = []

}

class Sensor: NSObject, Codable {
   var accx: Double?
   var accy: Double?
   var accz: Double?
   var gyrox: Double?
   var gyroy: Double?
  var gyroz: Double?
}

Я использую это для преобразования в словарь:

extension Encodable {

var dictionary: [String: Any]? {
    do{

        let encoder = JSONEncoder()
        encoder.outputFormatting = .prettyPrinted
        guard let data = try? encoder.encode(self) else { return nil }
        let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
        print(json)
        return json
    } catch {
        return nil
    }
}
}

Я застрял с этим, и я не знаю, иду ли я по правильному пути. Должен ли я изменить способ организации этого словаря?


person Carlos Henrique    schedule 13.04.2018    source источник


Ответы (1)


Вы видите результат NSDictionary.description там, а результат NSDictionary.description не JSON и не обязательно является точным представлением содержащихся объектов.

Проблем с декодированием нет. Пример:

Welcome to Apple Swift version 4.0.3 (swiftlang-900.0.74.1 clang-900.0.39.2). Type :help for assistance.
  1> import Foundation
  2> let json = "{ \"sensors\": [ { \"accx\": 0.011444091796875 } ] }"
json: String = "{ \"sensors\": [ { \"accx\": 0.011444091796875 } ] }"
  3> let d = try! JSONSerialization.jsonObject(with: json.data(using: .utf8)!, options: []) as! [String: Any] 
d: [String : Any] = 1 key/value pair {
  [0] = {
    key = "sensors"
    value = {
      payload_data_0 = 0x0000000100111ad0
      payload_data_1 = 0x0000000000000000
      payload_data_2 = 0x0000000000000000
      instance_type = 0x00000001014179c8 libswiftCore.dylib`InitialAllocationPool + 4888
    }
  }
}

Когда мы печатаем словарь, возвращенный JSONSerialization, мы видим число в кавычках:

  4> print(d)
["sensors": <__NSSingleObjectArrayI 0x100111ad0>(
{
    accx = "0.011444091796875";
}
)
]

Но когда мы на самом деле извлекаем число из вложенных контейнеров, это на самом деле Double:

  5> ((d["sensors"] as! [Any])[0] as! [String: Any])["accx"] as! Double
$R0: Double = 0.011444091796875

Мораль этой истории: Не ожидайте, что description объекта будет точной сериализацией его значения. Если вам нужна точная сериализация, преобразуйте объект в JSON или список свойств или проверьте его в отладчик.

person rob mayoff    schedule 13.04.2018
comment
Спасибо чувак. Я сомневался, потому что веб-сервис возвращает код 500, я думал, что ошибка была из-за того, что мой парсер JSON - person Carlos Henrique; 19.04.2018