Форматирование JSON в swift: недопустимый тип в записи JSON (OS_dispatch_data) - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь отправить запрос на публикацию и api, который содержит список «элементов», который может быть изображением или текстом.

Однако я получаю сообщение об ошибке (указано в заголовке)

Вот код, превращающий мои объекты в JSON

    var json = [String: Any]()
    var jsonItems = [Any]()

    for i in 0...(items.count - 1){

        var it = [String: Any]()
        if let imageData = items[i].image?.jpgData(){
            it["image"] = imageData
        }

        if let text = items[i].text{
            it["text"] = text
        }

        if i == 0 {
            it["is_profile"] = true
            it["face_detected"] = faceDetected
        }

        jsonItems.append(it)
    }
    json["items"] = jsonItems

Есть ли причина, по которой это не будет правильно отформатировано?

EDIT:

Функция jpgData

func jpgData() -> Data? {
    return UIImageJPEGRepresentation(self, 0.8)
}

Пример кода, вызывающего сбой:

extension Dictionary {
    var json: String {
        let invalidJson = "Not a valid JSON"
        do {
            let jsonData = try JSONSerialization.data(withJSONObject: self, options: .prettyPrinted)
            return String(bytes: jsonData, encoding: String.Encoding.utf8) ?? invalidJson
        } catch {
            return invalidJson
        }
    }
}

В дополнение к моему примеру кода, передача созданного dict в качестве параметра для запросов Alamofire, запросов URLSession и т. Д. Вызывает сбой с ошибкой из заголовка

РЕДАКТИРОВАТЬ: Решение Данные изображения действительно должны быть закодированы. Ощущения так очевидны в ретроспективе. Кодирование Base64 работало для распечатки структуры, как в моем расширении, но для сетевых запросов я в конечном итоге использовал класс MultipartFormData Alamofire (пользовательская оболочка вокруг него) и добавил как application/octet-stream для mimetype. Хотел бы я использовать эмодзи лицевой маской здесь. Я принял один из двух ответов, в которых говорилось о кодировании, которое на самом деле содержало пример кода.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

После преобразования в данные JPEG попробуйте кодировать в base64

let strBase64 = imageData.base64EncodedString(options: .lineLength64Characters)

Проверьте этот ответ для получения дополнительной информации Преобразование между UIImage и строкой Base64

0 голосов
/ 07 сентября 2018

Данные не могут быть помещены в JSON.Объект данных должен быть закодирован.Возможно, с использованием кодировки base64.

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