Объявить пустой словарь в кодируемом классе - PullRequest
0 голосов
/ 11 марта 2019

Я хочу отправить пустой словарь, подобный этому

“visitor_attrs”: {
}

Я пытаюсь реализовать пустой словарь в классе.В декодере я получаю некоторое предупреждение, так как Никакие кандидаты 'декодирования' не производят ожидаемый контекстный тип результата 'Словарь' .Как я могу это сделать?

var data: String
var event: String
var visitorAttrs: Dictionary<String, Any>

init(data: String, event: String) {
    self.data = data
    self.event = event
    self.visitorAttrs = [:]
}

private enum CodingKeys: String, CodingKey {
    case data
    case event
    case visitorAttrs = "visitor_attrs"
}

required public init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)
    self.data = try container.decode(String.self, forKey: .data)
    self.event = try container.decode(String.self, forKey: .event)
    self.visitorAttrs = try container.decode(Dictionary<String:Any>.self, forKey: .visitorAttrs)
}

public func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)
    try container.encode(self.data, forKey: .data)
    try container.encode(self.event, forKey: .event)
    try container.encode(self.visitorAttrs, forKey: .visitorAttrs)
} 

Ответы [ 2 ]

1 голос
/ 11 марта 2019

Ошибка вызвана тем, что значение Any в вашем словаре равно Any, а значение Any не может быть расшифровано, замените его на String (или любой другой тип данных), и это должно работать.

var visitorAttrs: Dictionary<String, String>

Исправьте эту проблему, и вы получите ожидаемое поведение

let item = Item(data: "data", event: "event") //I gave your class the name Item
let encoder = JSONEncoder()

do {
    let data = try encoder.encode(item)
    if let str = String(data: data, encoding: .utf8) {
        print(str)
    }
} catch {
    print(error)
}

Вывод

{ "событие": "событие", "visitor_attrs": {}, "данные": "Данные"}

0 голосов
/ 11 марта 2019

Я предполагаю, что из-за того, что visitorAttrs пусто в вашем ответе JSON, ему не удается извлечь из него словарь, поскольку его нет.

У вас есть два варианта (насколько я знаю)

  1. Сделайте свойство visitorAttrs необязательным, поэтому, если у вас ничего нет, оно все равно сможет правильно декодироваться, или,

  2. Установить значение visitorAttrs пустым словарем, если не удается его декодировать

let visitorAttrs = try? container.decode(Dictionary<String:Any>.self, forKey: .visitorAttrs)
self.visitorAttrs = visitorAttrs ?? [:]
...