【问题标题】:How to get the raw JSON from an API call如何从 API 调用中获取原始 JSON
【发布时间】:2018-10-24 18:01:14
【问题描述】:

[注意:为了清楚起见,已对其进行了编辑,因为对于我想要的内容似乎有些混乱。我想要原始 JSON。在这种情况下,它应该是{"foo":"bar"}。重要的是要强调 我希望这是一个字符串!我不需要将其解码为 Swift 对象或以任何方式编组或修改!]

是否可以从 API 调用中获取原始 JSON?目前我正在使用URLSession.dataTask(with:request),但响应数据包括响应头和正文。我只想要原始 JSON 作为字符串返回给我。

这是我正在使用的代码:

// Build the URL
var urlComponents = URLComponents()
urlComponents.scheme = "http"
urlComponents.host = "127.0.0.1"
urlComponents.port = 80
urlComponents.queryItems = [URLQueryItem(name: "foo", value: "bar")]
guard let url = urlComponents.url else {
    fatalError("Could not create URL from components")
}

// Configure the request
var request = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")

let task = URLSession.shared.dataTask(with: request) {(responseData, response, error) in
    DispatchQueue.main.async {
        guard error == nil else {
            print("ERROR: \(String(describing: error))")
            return
        }

        guard let _ = response else {
            print("Data was not retrieved from request")
            return
        }

        print("JSON String: \(String(describing: String(data: responseData!, encoding: .utf8)))")

        if let resData = responseData {
            let jsonResponse = try? JSONSerialization.jsonObject(with: resData, options: [])

            if let response = jsonResponse as? [String: Any] {
                print("RESPONSE:")
                dump(response)
            } else {
                print("SOMETHING WENT WRONG")
            }
        }
    }
}

task.resume()

这会在控制台中生成以下内容:

JSON String: Optional("HTTP/1.1 OK\nContent-Type: application/json\n\n{\"foo\":\"bar\"}")
SOMETHING WENT WRONG

【问题讨论】:

  • 可以发一些截图或者代码吗?

标签: ios json swift nsurlsession


【解决方案1】:

您将在完成处理程序Data 参数中找到响应正文。你决定你想用它做什么。

let task = session.dataTask(with: request) { (responseData, response, responseError) in
    guard responseData = responseData else { return }
    print("JSON String: \(String(data: responseData, encoding: .utf8))")
}

【讨论】:

  • Darrell,这个答案对你来说太棒了!
  • 这给了我响应头和正文。我想要身体。 Optional("HTTP/1.1 OK\nContent-Type: application/json\n\n[{\"foo\":\"bar\"}]")
  • 您可能需要在请求中添加标头,即["Content-Type":"application/json", "Accept":"application/json"]
  • 试过了(见更新的问题),但似乎没有什么不同。
  • 是的。 responseData 中唯一的内容是 json。我认为问题出在您的服务器上。
【解决方案2】:

也许我把你的问题过于简单化了,但看起来你只是想要一些简单的东西,比如数据到字符串的转换。

let jsonString = String(data: responseData, encoding: .utf8)

【讨论】:

    【解决方案3】:

    您需要序列化响应数据以获取原始 JSON:

    URLSession.shared.dataTask(with: urlRequest) { (responseData, response, error) in
    
        // check for errors, then...
    
        if let resData = responseData {                    
            let jsonResponse = try? JSONSerialization.jsonObject(with: resData, options: [])
    
            if let response = jsonResponse as? [String: Any] {
                 // ... handle response
            }
        }
    }
    

    【讨论】:

    • dump(resData) 显示 177 个字节,但 dump(jsonResponse) 返回 nil
    • 你试过像try JSONSerialization.jsonObject(with: responseData, options: []) as? [[String: Any]]这样向下转换你的序列化json吗
    • 这给了我一个“来自'数据的演员?'到不相关的类型 '[String : Any]' 总是失败”警告和“不能使用类型的参数列表调用 'jsonObject' (with: [String : Any],”错误。
    • 现在检查@DarrellBrogdon
    • TIC Read Status [2:0x600000165c40]: 1:57 就是我们所说的“控制台喷射”——即:XCode 的开发人员用于他们自己的诊断目的的输出。您可以阅读有关该消息的更多信息here
    猜你喜欢
    • 2014-04-09
    • 2012-05-14
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    • 2015-12-07
    • 2021-07-04
    • 1970-01-01
    • 2021-01-19
    相关资源
    最近更新 更多