1

正如在帖子的標題中提到的,當我嘗試將Dictionary轉換爲JSON數據時,我得到NSInvalidArgumentException - 'JSON寫入中的無效頂級類型' swiftNSInvalidArgumentException - '無效的JSON寫入的頂級類型' - 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 
     } 

    } 

我傳遞字典作爲參數,沒有得到什麼問題。請幫助我們。

謝謝!

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

如果你真的需要傳遞一個可選的,那麼你必須解開它:

+0

爲什麼在這行的末尾添加'as Data?'? – Moritz

+0

另外,您將'Any?'傳遞給'JSONSerialization.data(withJSONObject:)',但它應該先安全地解包。 – Moritz

+0

哦! '作爲數據?'錯誤...我是新來的迅速。所以請告訴我應該做些什麼。謝謝指出 – iAkki

回答

1

注意,你並不需要所有這些東西,因爲你的函數可以是簡單

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'一樣,但返回一個Optional,而不是拋出錯誤,我們不得不趕上。在''user_name「:username!'中使用'!'是不同的,這意味着你正在」強制解包「可選值。避免強制(如果值爲零,會崩潰)的常用方法是使用'if let'。 – Moritz

+0

有用的信息。謝謝 – iAkki

相關問題