1

Как упоминалось в заголовке сообщения, я получаю NSInvalidArgumentException - «Недопустимый тип верхнего уровня в JSON write» при попытке конвертировать словарь в JSON Data в swiftNSInvalidArgumentException - «Неверный тип верхнего уровня в JSON write» - Swift

let userInfo: [String: String] = [ 
      "user_name" : username!, 
      "password" : password!, 
      "device_id" : DEVICE_ID!, 
      "os_version" : OS_VERSION 
     ] 

let inputData = jsonEncode(object: userInfo) 

. . .

static private func jsonEncode(object:Any?) -> Data? 
    { 
     do{ 
      let encoded = try JSONSerialization.data(withJSONObject: object, options:[]) as Data? <- here occured NSInvalidArgumentException 

      if(encoded != nil) 
      { 
       return encoded 
      } 
      else 
      { 
       return nil 
      } 
     } 
     catch 
     { 
      return nil 
     } 

    } 

Я передаю словарь как параметр, не понимая, что происходит не так. Пожалуйста, помогите мне, ребята.

Спасибо!

+0

Почему вы добавили 'as Data?' В конце этой строки? – Moritz

+0

Кроме того, вы передаете 'Any?' В 'JSONSerialization.data (withJSONObject:)', но сначала должны быть безопасно распакованы. – Moritz

+0

ой! «как данные»? по ошибке .. Я новичок в быстром. Поэтому, пожалуйста, скажите мне, что должно быть сделано. Thanx BTW для указания – iAkki

ответ

1

Обратите внимание, что вам не нужны все эти вещи, ваша функция может быть столь же просто, как:

func jsonEncode(object: Any) -> Data? { 
    return try? JSONSerialization.data(withJSONObject: object, options:[]) 
} 

Если вам действительно нужно пройти Факультативный, то вам придется разворачивать его:

func jsonEncode(object: Any?) -> Data? { 
    if let object = object { 
     return try? JSONSerialization.data(withJSONObject: object, options:[]) 
    } 
    return nil 
} 
+0

Спасибо Эрик. Это работает нормально. Вначале я бы назвал 'let encoded = try JSONSerialization.data (withJSONObject: object, options: [])' .. он дает мне ошибку: ** Ошибка, отброшенная отсюда, не обрабатывается **. .. Итак, я ухаживал за ним и реализовывал соответственно, просто путался с **? ** и **! ** отметкой, когда и зачем ее использовать. – iAkki

+0

@AkshayGajarlawar При использовании 'try?', Так как в моем примере вам не нужен * блок 'do catch'. 'try?' походит на 'try', но возвращает опцию вместо того, чтобы бросать ошибки, которые нам пришлось бы поймать. Использование '!' Как в вашем '' user_name ": username!' Отличается, это означает, что вы «принудительно разворачиваете» значение «Дополнительно». Обычный способ избежать форсирования (который падает, если значение равно нулю) заключается в использовании 'if let'. – Moritz

+0

Полезная информация. спасибо – iAkki

 Смежные вопросы

  • Нет связанных вопросов^_^