2016-09-01 8 views
1

Я пытаюсь преобразовать строку UIImage в base 64, чтобы ее можно было сохранить в файл, а затем загрузить. Я делаю следующее:Swift: Invalid Type in JSON write (UIImage)

фрагмент кода:

var writePath: String! 
var params: NSMutableDictionary = ["file1": UIImageJPEGRepresentation(self.imageView1.image!, 1.0)!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0)), "userId" : user_id] 

    do { 
     let bodyJson = try NSJSONSerialization.dataWithJSONObject(params, options: .PrettyPrinted) 
     let path: NSURL = NSURL(string: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])! 
     writePath = path.URLByAppendingPathComponent("body.data").absoluteString 
     try bodyJson.writeToFile(writePath, options: .AtomicWrite) 
     writePath = String(format: "file://%@", writePath) 
    } catch { 
     print(error) 
    } 

Но, я получаю ошибку Invalid Type. Мне нужно использовать фоновый сеанс, а также отправить некоторые параметры, поэтому я использую этот метод.

enter image description here

РЕШИТЬ: Некоторые другие вещи были причиной этой проблемы.

+0

Можете ли вы добавить скриншот ошибки? user_id - Int? –

+0

@MarcoSantarossa user_id - это строка. У меня есть и другие параметры. Все они - Струны. –

+0

вы можете написать 'var params: [String: String]'. В любом случае, вы можете добавить скриншот ошибки? –

ответ

1

Просто попытка решить, попробуйте следующее:

var writePath: String! 
    let params: [String: String] = ["file1": UIImageJPEGRepresentation(self.imageView1.image!, 1.0)!.base64EncodedStringWithOptions(.Encoding64CharacterLineLength), "userId" : user_id] 

    do { 
     let bodyJson = try NSJSONSerialization.dataWithJSONObject(params, options: .PrettyPrinted) 
     let path: NSURL = NSURL(string: NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0])! 
     writePath = path.URLByAppendingPathComponent("body.data").absoluteString 
     try bodyJson.writeToFile(writePath, options: .AtomicWrite) 
     writePath = String(format: "file://%@", writePath) 
    } catch { 
     print(error) 
    } 
+0

В чем разница ч/б моего кода и вашего? Выглядит так же. –

+0

@KaranveerSingh Я добавил быстрый словарь и 'Encoding64CharacterLineLength'option. У меня нет проблем с этим кодом –

+0

Я уже пробовал этот вариант, но имел такую ​​же проблему. Я сохранил это изображение в Core Data. Может быть, это проблема? –

0

Мы делаем следующее (извините Obj-C для быстрой конверсии, что может быть немного неправильно):

let data = UIImageJPEGRepresentation(img,0.5) 
let base64Encoded = data.base64EncodedStringWithOptions(0) 
let jsonDic = ["image" : base64Encoded] 
... 
... 

И теперь jsonDic можно преобразовать в правильный сериализованный JSON, используя NSJSONSerialization.

Также очень важно убедиться, что ваши ключи jsonDic всегда являются строками. Вы не можете создать правильный JSON-сериализованный объект, если ключ не является строкой.

+0

Спасибо, я дважды проверил переменную словаря, внесли некоторые изменения и теперь, он работает –