Json 解析错误:在 Swift iOS 中使用未声明的类型“Foundation”

Posted

技术标签:

【中文标题】Json 解析错误:在 Swift iOS 中使用未声明的类型“Foundation”【英文标题】:Json Parsing Error: use of undeclared type 'Foundation' in Swift iOS 【发布时间】:2018-10-06 16:13:53 【问题描述】:

我正在使用 Swift 创建一个应用程序,我必须使用以下 URL 显示国家列表:

https://restcountries.eu/rest/v2/all

在这里我只需要获取name 密钥并添加到我的NSMutableArray。当我尝试使用 URLSession 解析它时,出现错误:

expression produced error: error: /var/folders/_3/27lhgzw9699c4_yg37r72_d80000gp/T/expr40-bcf47d..swift:1:65: error: use of undeclared type 'Foundation'
Swift._DebuggerSupport.stringForPrintObject(Swift.UnsafePointer<Foundation.Data>(bitPattern: 0x105c0c2f0)!.pointee)

下面是我的代码:

func fetchCountryList(countryURL:URL, completion:@escaping (NSDictionary) -> ()) 

            print(countryURL)

            let request = NSMutableURLRequest( url: countryURL as URL)

            let task = URLSession.shared.dataTask(with: request as URLRequest) 
                data, response, error in
                do
                    if let data = data,
                        let jsonString =  try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
                        , error == nil 
                        completion(jsonString)
                     else 
                        print("error=\(error!.localizedDescription)")
                        let errorDict = ["error_status":true,"message":error!.localizedDescription] as [String : Any]
                        completion(errorDict as NSDictionary)

                    
                
                catch
                    print("error=\(error.localizedDescription)")
                    let errorDict = ["error_status":true,"message":error.localizedDescription] as [String : Any]
                    completion(errorDict as NSDictionary)

                

            
            task.resume()
    

任何人都可以在这里建议我我的错误。提前致谢!

【问题讨论】:

不要在 Swift 中使用 NSDictionary。使用正确的 Swift 字典。不要在 Swift 中使用 NSMutableURLRequest。使用URLRequest。不要在 Swift 中使用 .mutableContainers 选项(一旦切换到 Swift 字典)。 【参考方案1】:

替换

try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary

try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [[String: Any]]

由于它是一个对象数组,我们还需要将 json 转换为 array

要获得array of country names,我们可以这样做:

guard let countries = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [[String: Any]] else 
    return

let countryNames = countries.map  $0["name"] as! String 

【讨论】:

没有必要在 Swift 集合中使用.mutableContainers 只需重用他的代码并稍作更改,以帮助他理解更简单的更改/少量更改。顺便说一句,感谢@rmaddy 的建议。【参考方案2】:

替换

 let jsonString =  try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
                

if let result =  try JSONSerialization.jsonObject(with: data, options:[]) as? [[String:Any]] 
   for item in result 
     print(item["name"])
     
 

响应是数组而不是字典也不要使用 NS 的东西

NSDictionary => [字符串:任意]

NSUrl => 网址

NSMutableURLRequest => URLRequest


func fetchCountryList(countryURL:URL, completion:@escaping (_ arr :[[String:Any]]?, _ error:Error?) -> ()) 
        
            print(countryURL)
        
            let request = URLRequest( url: countryURL)

            let task = URLSession.shared.dataTask(with: request) 
                data, response, error in
                do
                    if let data = data,
                        let jsonString =  try JSONSerialization.jsonObject(with: data, options:[]) as? [[String:Any]]
                        , error == nil 
                        completion(jsonString,nil)
                     else 
                        print("error=\(error!.localizedDescription)")
                        let errorDict = ["error_status":true,"message":error!.localizedDescription] as [String : Any]
                        completion(nil,error)
                        
                    
                
                catch
                    print("error=\(error.localizedDescription)")
                    let errorDict = ["error_status":true,"message":error.localizedDescription] as [String : Any]
                    completion(nil,error)
                    
                
                
            
            task.resume()
    

打电话

serviceModel.fetchCountryList(countryURL:countryURL) (result,error) in 
  if let res = result 
    print(res)
   
           

    

【讨论】:

嗨@Sh_Khan,感谢您的回复,替换后我收到错误:无法在此行中将类型“[[String:Any]]”的值转换为预期的参数类型“NSDictionary”:完成(jsonString) 我认为不需要状态,因为你不处理状态 false 所以我省略了它,只返回错误见编辑 好的,我将这个方法称为 :let serviceModel = ServiceModel() serviceModel.fetchCountryList(countryURL:countryURL) responsStr in 你能帮我调用这个方法以获得两个Completion吗?

以上是关于Json 解析错误:在 Swift iOS 中使用未声明的类型“Foundation”的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 在 Swift 中使用 NSJSONSerialization 解析 JSON 字典

如何以正确的方式在 IOS SWIFT 3 中解析 Google 距离矩阵 API JSON

在swift iOS中使用JSON解码器解析本地Json

iOS - 在 Swift 中调用 Webservice 并解析 JSON

在 Swift 问题中为 iOS 应用程序解析 JSON

如何在 IOS 上使用 Swift 解析 JSON,从 PHP 服务脚本发送?