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

相关问题