无法使用类型的参数列表调用“jsonObject”
Posted
技术标签:
【中文标题】无法使用类型的参数列表调用“jsonObject”【英文标题】:Cannot invoke 'jsonObject' with an argument list of type 【发布时间】:2017-05-15 15:22:43 【问题描述】:当使用此代码从具有基本身份验证的服务器获取 JSON 时:
let config = URLSessionConfiguration.default
let userPasswordData = "\(username!):\(password!)".data(using: .utf8)
let base64EncodedCredential = userPasswordData!.base64EncodedString(options: Data.Base64EncodingOptions.init(rawValue: 0))
let authString = "Basic \(base64EncodedCredential)"
config.httpAdditionalHeaders = ["Authorization" : authString]
let session = URLSession(configuration: config)
let url = URL(string: "https://theforest.academy/api/v1/auth")
let task = session.dataTask(with: url!)
(data, response, error) in
if (response as? HTTPURLResponse) != nil
do
if let data = data
// let json1 = try JSONSerialization.jsonObject(with: data) as? [String: Any]
let json = try JSONSerialization.jsonObject(with: data, options: [], error: []) as? [String: Any]
if(json["valid"])
print(json["token"])
else
print("Invalid login")
catch
print("Error deserializing JSON: \(error)")
我收到以下错误
无法使用类型为 '( 的参数列表调用 'jsonObject': 数据,选项:[Any],错误:[Any])'
【问题讨论】:
您应该将数据传递给初始化程序而不是字符串,为什么还要从数据中创建字符串? @dan 我编辑了答案以将数据传递给初始化程序,它给出了同样的错误。 你有正确的语法,在评论// let json1 = try JSONSerialization.jsonObject(with: data) as? [String: Any]
;)
developer.apple.com/library/content/documentation/Swift/… 我认为自 Swift 2.2 以来错误管理发生了变化。现在是 try/catch,error
参数不再出现在“方法调用签名”中。
【参考方案1】:
看documentation,好像只有两个选择:
jsonObject(with: Data, options: JSONSerialization.ReadingOptions = [])
和
jsonObject(with: InputStream, options: JSONSerialization.ReadingOptions = [])
我认为您正在寻找第一种方法。也许你把它和
混淆了writeJSONObject(Any, to: OutputStream, options: JSONSerialization.WritingOptions = [], error: NSErrorPointer)
所以,简而言之,这样的方法是不存在的。这就是您收到错误消息的原因。
【讨论】:
尝试第一个得到以下错误:无法分配给“JSONSerialization.ReadingOptions.Type”类型的不可变表达式 @ScottyBlades,这是方法的签名。这意味着选项字段的默认值为[]
,它的类型为JSONSerialization.ReadingOptions
。通常你会像JSONSerialization.jsonObject(with: data)
或JSONSerialization.jsonObject(with: data, options: [/*your options*/])
一样使用它。
这是我的理解……但这并不能解释为什么我会收到这个错误。
确实如此,因为你正在做一些你不应该做的事情。我特别提到了您应该如何调用该方法。您应该在代码中的某处有 JSONSerialization.ReadingOptions = [],即分配给不可变的表达式。【参考方案2】:
这是因为我们在获取数据时没有处理错误。所以我们需要安全地键入种姓数据,然后将其传递给 JsonSerializer。这是代码。
do
let data = try NSData.init(contentsOfFile: path) as Data
let jsonArray = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
print(jsonArray)
catch
print("Error getting data")
【讨论】:
以上是关于无法使用类型的参数列表调用“jsonObject”的主要内容,如果未能解决你的问题,请参考以下文章
无法使用类型为“()”的参数列表为类型“Int”调用初始化程序