当前位置: 首页 > 面试题库 >

如何使用NSURLSession在Swift中解析JSON

郑星辰
2023-03-14
问题内容

我正在尝试解析JSON但收到此错误:

在没有更多上下文的情况下,表达类型不明确

我的代码是:

func jsonParser() {

    let urlPath = "http://headers.jsontest.com/"
    let endpoint = NSURL(string: urlPath)
    let request = NSMutableURLRequest(URL:endpoint!)

    let session = NSURLSession.sharedSession()
    NSURLSession.sharedSession().dataTaskWithRequest(request){ (data, response, error) throws -> Void in

        if error != nil {
            print("Get Error")
        }else{
            //var error:NSError?
            do {
                let json:AnyObject =  try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions(rawValue: 0)) as? NSDictionary

            print(json)

        } catch let error as NSError {
            // error handling
            print(error?.localizedDescription)
        }
        }
    }
    //task.resume()
}

在没有尝试捕获的情况下,在Xcode 6.4中可以正常工作,但是在Xcode 7中则无法工作。


问题答案:

不要AnyObject为已解码对象声明类型,因为您希望它是an,NSDictionary并且您正在执行转换来做到这一点。

另外,最好将零选项用于NSJSONSerialization而不是随机选项。

在我的示例中,我还使用了一个自定义错误类型来进行演示。

请注意,如果您使用的是自定义错误类型,则还必须包括泛型,catch以使其详尽无遗(在本示例中,将简单向下转换为NSError)。

enum JSONError: String, ErrorType {
    case NoData = "ERROR: no data"
    case ConversionFailed = "ERROR: conversion from JSON failed"
}

func jsonParser() {
    let urlPath = "http://headers.jsontest.com/"
    guard let endpoint = NSURL(string: urlPath) else {
        print("Error creating endpoint")
        return
    }
    let request = NSMutableURLRequest(URL:endpoint)
    NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) in
        do {
            guard let data = data else {
                throw JSONError.NoData
            }
            guard let json = try NSJSONSerialization.JSONObjectWithData(data, options: []) as? NSDictionary else {
                throw JSONError.ConversionFailed
            }
            print(json)
        } catch let error as JSONError {
            print(error.rawValue)
        } catch let error as NSError {
            print(error.debugDescription)
        }
   }.resume()
}

与Swift 3.0.2相同:

enum JSONError: String, Error {
    case NoData = "ERROR: no data"
    case ConversionFailed = "ERROR: conversion from JSON failed"
}

func jsonParser() {
    let urlPath = "http://headers.jsontest.com/"
    guard let endpoint = URL(string: urlPath) else {
        print("Error creating endpoint")
        return
    }
    URLSession.shared.dataTask(with: endpoint) { (data, response, error) in
        do {
            guard let data = data else {
                throw JSONError.NoData
            }
            guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? NSDictionary else {
                throw JSONError.ConversionFailed
            }
            print(json)
        } catch let error as JSONError {
            print(error.rawValue)
        } catch let error as NSError {
            print(error.debugDescription)
        }
    }.resume()
}


 类似资料:
  • 问题内容: 我有一个NSURLSession调用dataTaskWithRequest以这种方式发送POST请求 响应等于: 我的问题是我不知道如何获取名称为MYCOOKIEIS的“ Set-Cookie”中的cookie。 我将在用户登录时使用它,因此,如果用户未登录->登录(调用登录api),否则请转到主屏幕并调用其他API。 有人可以帮助我从那里拿走饼干吗? 问题答案: Swift呈现形式可

  • 问题内容: 我对获取水果的细节感到困惑 想要使用“ Decodable”解析JSON 还可以请我建议cocoapod库快速下载图像 问题答案: 您面临的问题是因为您返回的水果数据不同。 对于第一个ID,它返回一个叫,但在第二个它返回一个字符串叫。 另外,在解析JSON时,ID似乎是a 而不是。 因此,您可以从数据中获得两个可选值。 因此,“可分解结构”应如下所示: 由于您的网址似乎无效,因此我在主

  • 问题内容: 我正在使用一个API,该API返回如下所示的JSON 在Swift中,我使用两个函数来获取并解析JSON 然后我用 可以很好地解析JSON。当我打印出 我得到了数组的所有内容。但是,我无法访问每个单独的索引。我很肯定这是一个数组,因为我之间 返回正确的长度。但是,如果我尝试通过使用访问单个索引 XCode关闭语法高亮显示并给我以下信息: 并且代码将无法编译。 这是XCode 6的错误,

  • 问题内容: 我有一个必须下载多个大文件的应用程序。我希望它依次而不是同时下载每个文件。当它同时运行时,该应用程序将过载并崩溃。 所以。我试图将downloadTaskWithURL包装在NSBlockOperation内,然后在队列上设置maxConcurrentOperationCount = 1。我在下面编写了此代码,但由于两个文件同时下载而无法正常工作。 如何正确编写此代码以实现我一次只下载

  • 我正在使用来解析Json数据。我的Json数据如下: GsonParse.java 我使用以下方法来解析此JSON数据。 我面对以下错误。

  • 问题内容: 我在解析Json文件时遇到问题。尝试解析一个Json文件: 这是我为其定义的两个结构。 暂停结构: AttachedModel模型结构: 然后,我为其创建一个键和一个函数: 在功能上: 这是输出 问题是,即使有数据,该行也始终为假,并且转到“ 有人可以告诉我这里的问题在哪里吗? 问题答案: 为您的json创建此模型类: 然后,您可以像这样解析它: