无法使用类型的参数列表调用“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”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用参数列表调用类型“附加”

无法使用“(nil)”类型的参数列表调用“保存”

无法使用类型为“”的参数列表调用类型“”的初始化程序

无法使用类型为“()”的参数列表为类型“Int”调用初始化程序

无法使用类型参数列表调用“requestAuthorizationToShareTypes”

无法使用类型参数列表调用“requestAuthorizationToShareTypes”