Получение недопустимого типа в JSON write (__SwiftValue) при попытке создать объект json - PullRequest
0 голосов
/ 16 июня 2020

Я пытаюсь создать объект json и разместить его на веб-сервере. Я получаю эту ошибку при попытке загрузить: Invalid type in JSON write (__SwiftValue), я видел несколько сообщений, но они довольно старые или используют Alamofire / Swifty JSON, а я нет, поэтому я не мог понять, в чем проблема. Это мой объект:

struct Quantity: Codable {
    var ml: Int
    var price: Float

    init(ml: Int, price: Float) {
        self.ml = ml
        self.price = price
    }
}

struct Product: Codable {
    let uuid: String
    let productName: String
    let productManufacturer: String
    let productImage: String 
    let quantities: [Quantity]
    let additionalInfo: String? 
    let storeID: String
    let storeName: String
    let ownerID: String 

    init(uuid: String, name: String, manufacturer: String, image: String, quantities: [Quantity], additionalInfo: String?, storeID: String, storeName: String, ownerID: String) {
        self.uuid = uuid
        self.productName = name
        self.productManufacturer = manufacturer
        self.productImage = image
        self.quantities = quantities
        self.additionalInfo = additionalInfo
        self.storeID = storeID
        self.storeName = storeName
        self.ownerID = ownerID
    }


}

Вот как я пытаюсь его загрузить:

func uploadProduct(product: Product ,completion: @escaping(Error?) -> Void) {
    let jsonObject: [String: Any] = [
        "product_id": product.uuid,
        "name": product.productName,
        "manufacturer": product.productManufacturer,
        "image_url": product.productImage,
        "quantities": product.quantities,
        "additionalInfo": product.additionalInfo ?? "",
        "store_id": product.storeID,
        "store_name": product.storeName,
        "owner_id": product.ownerID,
    ]

    do {
        let jsonData = try JSONSerialization.data(withJSONObject: jsonObject, options: .prettyPrinted)
        //HTTP POST
        guard let url = URL(string: ApplicationURLs.productCreation) else { return }
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.addValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = jsonData
        _ = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
            if let error = error {
                completion(error)
                return
            }
            if let response = response as? HTTPURLResponse {
                if response.statusCode == 200 {
                    //Product was added.
                    completion(nil)
                }else {
                    print(response.statusCode)
                    completion(error)
                }
            }
        }).resume()
    }catch { debugPrint("Couldn't create JSON Object...") }
}

Я даже не дохожу до блока catch, поэтому я не действительно знаю, откуда взялась ошибка.

Оба, Product и Quantity имеют CodingKeys, совпадающие с json, которое я ожидаю и пытаюсь отправить, я просто удалил их из сообщения в не загромождайте его.

1 Ответ

1 голос
/ 16 июня 2020

Прежде всего, вам не нужен init в Struct. Struct имеет инициализатор по умолчанию для каждого элемента, поэтому, если вам не нужно делать ничего лишнего (как мы видим, это не так) ... они уже созданы, вы можете удалить этот код

struct Quantity: Codable {
    var ml: Int
    var price: Float

}

struct Product: Codable {
    let uuid: String
    let productName: String
    let productManufacturer: String
    let productImage: String 
    let quantities: [Quantity]
    let additionalInfo: String? 
    let storeID: String
    let storeName: String
    let ownerID: String 

}

Затем используйте JSONEncoder для кодирования вашего объекта ...

do {
    let data = try JSONEncoder().encode(Product)
    // use data here
} catch {
    print(error)
}

Вам не нужно создавать let jsonObject: [String: Any] для преобразования продукта в json

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...