URLSession returns 数据的大小而不是数据的实际内容

URLSession returns the size of the data instead of the actual contents of the data

我正在尝试学习如何使用 URLSession,所以我正在尝试从 [=31] 中获取 raw JSON =] 作为一致性检查是否有效。但我不明白为什么它以字节为单位输出数据响应 size 而不是实际数据

我在网上找到的

Here's an example 并进行了修改以尝试将其设置为 return JSON:

import UIKit
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true


let url = URL(string: "http://date.jsontest.com/")!
let session = URLSession.shared
let q = session.dataTask(with: url) { data, response, error in
    do {
        print(data!)
    }
    catch {
        print("Error \(error)")
    }
}
q.resume()

此代码 return类似于 100 bytes,而不是 JSON 本身。没有任何意义,Apple's documentationdata 是“服务器 returned 的数据。”,那么为什么 returning 的大小数据而不是 URL?

的 JSON

数据任务的结果总是一个Data对象。您可以根据自己的喜好使用它。

例如,您可以将其转换为字符串并打印出来以查看服务器发回的内容。

import UIKit
import Foundation
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true


let url = URL(string: "http://date.jsontest.com/")!
let session = URLSession.shared
let q = session.dataTask(with: url) { data, response, error in
    do {
        let string = String(data: data!, encoding: .utf8)!
        print("Data as JSON: ")
        print(string) // Prints the actual JSON String.
    }
    catch {
        print("Error \(error)")
    }
}
q.resume()

或者更准确地说,您可能希望解析为另一个对象并获取其属性:

import UIKit
import Foundation
import PlaygroundSupport

PlaygroundPage.current.needsIndefiniteExecution = true

struct JSONTest: Codable {
    let date: String
    let time: String
}

let url = URL(string: "http://date.jsontest.com/")!
let session = URLSession.shared
let q = session.dataTask(with: url) { data, response, error in
    do {
        let jsonTest = try JSONDecoder().decode(JSONTest.self, from: data!)
        print("Date: \(jsonTest.date)") // Prints the `date` property of your JSON
    }
    catch {
        print("Error \(error)")
    }
}
q.resume()
  • 为了缩短代码,这个问题没有安全地处理可选值。如果可选值可以为零,请确保您安全地解包它们。