«NSInvalidArgumentException», причина: «Недопустимый тип в записи JSON (__SwiftValue)» - PullRequest
0 голосов
/ 12 мая 2019

Я получаю следующую ошибку при попытке закодировать объект.

'NSInvalidArgumentException', причина: 'Недопустимый тип в записи JSON (__SwiftValue)'

Определение этого объекта приведено ниже: -

public struct Item: Codable {
    public var _id: Int
    public var name: String
    public var price: Float

    public init(_id: Int, name: String, price: Float) {
        self._id = _id
        self.name = name
        self.price = price
    }    

    public enum CodingKeys: String, CodingKey {
        case _id = "id"
        case name
        case price
    }
}

И я пытаюсь закодировать это:

public func createDictionaryRequestForAddingItems(item : Item)->Data{
    let dictRequest = ["item":item];
    let dataRequest = try! JSONSerialization.data(withJSONObject: dictRequest, options: []);
    return dataRequest;
}

Если вместо объекта-элемента я использую простой объект, такой как String или Int, то все это работает, но когда для запроса требуется объект Item (экземпляр IS-A Codable), он дает вышеуказанная ошибка.

JSONSerialization.isValidJSONObject(item) всегда выдает false, даже для запросов, которые корректно кодируются.

1 Ответ

0 голосов
/ 12 мая 2019

Проблема в том, что вы пытаетесь объединить два типа кодировки JSON. JSONSerialization и Codable. JSONSerialization не имеет ничего общего с Codable.

На самом деле, вы хотите что-то вроде этого:

public func createDictionaryRequestForAddingItems(item: Item) -> Data {
   let dictRequest = ["item": item]
   let dataRequest = try! JSONEncoder().encode(dictRequest)
   return dataRequest
}

JSONSerialization может кодировать только следующие типы: Array, Dictionary, String, Bool и числовые типы (например, Double, Int).

...