Swift 3.0:将数据转换为JSON [String: Any]

40
晚上好,我正在尝试创建一个APIClient,但是我遇到了一个警告的问题:APIClient.swift:53:81: Cast from 'Data' to unrelated type '[String : Any]' always fails 在这段代码中,我正在尝试将Data转换为JSON作为字典[String : Any]
我猜编译器无法确定这种类型转换是否可能成功,因此会抛出错误,但我非常确信它会工作。那么我如何避免这个警告或者如何编写更安全的代码?
case 200:
         do {
            let json = try JSONSerialization.data(withJSONObject: data!, options: []) as? [String : Any]
            completion(json, HTTPResponse, nil)
         } catch let error {
             completion(nil, HTTPResponse, error)
         }

1
你正在使用错误的方法。 - Eric Aya
2个回答

94

正确的方法是:

do {  
    let json = try JSONSerialization.jsonObject(with: data!, options: []) as? [String : Any]
} catch {
    print("errorMsg")
}

感谢Eric Aya


4
如果在 try 后面没有加上 "?",编译器很可能会抛出一个错误,提示“从这里抛出的错误没有被处理”。 - Brian Sachetta
2
将这行代码添加到 do{ <this_code> }catch{ print("erroMsg") } 中。 - Pranavan SP
调用类方法“jsonObject”时没有精确匹配 - JCutting8

1

适用于Swift 5.*

使用此函数,您可以将API数据解码为可编码结构,还可以详细捕获解码错误。

  func decodeDataToObject<T: Codable>(data : Data?)->T?{
        
        if let dt = data{
            do{
              
               return try JSONDecoder().decode(T.self, from: dt)
            
        }  catch let DecodingError.dataCorrupted(context) {
            print(context)
        } catch let DecodingError.keyNotFound(key, context) {
            print("Key '\(key)' not found:", context.debugDescription)
            print("codingPath:", context.codingPath)
        } catch let DecodingError.valueNotFound(value, context) {
            print("Value '\(value)' not found:", context.debugDescription)
            print("codingPath:", context.codingPath)
        } catch let DecodingError.typeMismatch(type, context)  {
            print("Type '\(type)' mismatch:", context.debugDescription)
            print("codingPath:", context.codingPath)
        } catch {
            print("error: ", error)
        }
        }
        
        return nil
    }

用法: let user:User = decodeDataToObject(data: data)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接