Xcode playground - Swift 4 未收到 JSON 数据
Xcode playground - Swift 4 not receiving the JSON data
您好,我在 Xcode 游乐场工作,并尝试使用 API http-get 请求,使用 URLSession 和来自 jsonplaceholder 网站的虚拟数据。
见下面的代码。该代码没有 return 错误,但我期待 "usableData" 中的数据并打印它。数据是:
{ URL: http://jsonplaceholder.typicode.com/users/1 } { Status Code: 200, Headers {\n "Access-Control-Allow-Credentials" = (\n true\n );\n "CF-Cache-Status" = (\n HIT\n );\n "CF-RAY" = (\n "445f3d1003761d3e-MEL"\n );\n "Cache-Control" = (\n "public, max-age=14400"\n );\n Connection = (\n "keep-alive"\n );\n "Content-Encoding" = (\n gzip\n );\n "Content-Type" = (\n "application/json; charset=utf-8"\n );\n Date = (\n "Mon, 06 Aug 2018 05:52:38 GMT"\n );\n Etag = (\n "W/\"1fd-+2Y3G3w049iSZtw5t1mzSnunngE\""\n );\n Expires = (\n "Mon, 06 Aug 2018 09:52:38 GMT"\n );\n Pragma = (\n "no-cache"\n );\n Server = (\n cloudflare\n );\n "Transfer-Encoding" = (\n Identity\n );\n Vary = (\n "Origin, Accept-Encoding"\n );\n Via = (\n "1.1 ve…"
我期待一些 JSON 格式的数据:
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}
在这个阶段我只对获取数据感兴趣而不是解析它。
我做错了什么?欢迎任何帮助。谢谢。
---- 起始代码 --------------
import PlaygroundSupport
import Foundation
PlaygroundPage.current.needsIndefiniteExecution = true
let urlString = URL(string:"http://jsonplaceholder.typicode.com/users/1")
if let url = urlString {
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print()
} else {
if let usableData = data {
print(usableData) //JSONSerialization
}
}
}
task.resume()
}
您必须使用 Foundation class、NSJSONSerialization 将您从 api 获得的 json 数据转换为对象。所以你可以使用下面的行:
let usableData = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
print(usableData)
你的代码没问题。如果要将 JSON 数据打印为字符串,则需要将字节从 data
转换为字符串:
if let usableData = data {
let str = String(bytes: data, encoding: .utf8)
print("\(String(describing: str))") // just for debug output
}
请注意,这不是解析所必需的,您可以按照
struct User: Codable {
let id: Int
let name, username, email: String
let address: Address
let phone, website: String
let company: Company
}
struct Address: Codable {
let street, suite, city, zipcode: String
let geo: Geo
}
struct Geo: Codable {
let lat, lng: String
}
struct Company: Codable {
let name, catchPhrase, bs: String
}
if let usableData = data {
try {
let user = try JSONDecoder().decode(User.self, from: data)
} catch {
print("\(error)"
}
}
为此
您好,我在 Xcode 游乐场工作,并尝试使用 API http-get 请求,使用 URLSession 和来自 jsonplaceholder 网站的虚拟数据。
见下面的代码。该代码没有 return 错误,但我期待 "usableData" 中的数据并打印它。数据是:
{ URL: http://jsonplaceholder.typicode.com/users/1 } { Status Code: 200, Headers {\n "Access-Control-Allow-Credentials" = (\n true\n );\n "CF-Cache-Status" = (\n HIT\n );\n "CF-RAY" = (\n "445f3d1003761d3e-MEL"\n );\n "Cache-Control" = (\n "public, max-age=14400"\n );\n Connection = (\n "keep-alive"\n );\n "Content-Encoding" = (\n gzip\n );\n "Content-Type" = (\n "application/json; charset=utf-8"\n );\n Date = (\n "Mon, 06 Aug 2018 05:52:38 GMT"\n );\n Etag = (\n "W/\"1fd-+2Y3G3w049iSZtw5t1mzSnunngE\""\n );\n Expires = (\n "Mon, 06 Aug 2018 09:52:38 GMT"\n );\n Pragma = (\n "no-cache"\n );\n Server = (\n cloudflare\n );\n "Transfer-Encoding" = (\n Identity\n );\n Vary = (\n "Origin, Accept-Encoding"\n );\n Via = (\n "1.1 ve…"
我期待一些 JSON 格式的数据:
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}
在这个阶段我只对获取数据感兴趣而不是解析它。
我做错了什么?欢迎任何帮助。谢谢。
---- 起始代码 --------------
import PlaygroundSupport
import Foundation
PlaygroundPage.current.needsIndefiniteExecution = true
let urlString = URL(string:"http://jsonplaceholder.typicode.com/users/1")
if let url = urlString {
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
if error != nil {
print()
} else {
if let usableData = data {
print(usableData) //JSONSerialization
}
}
}
task.resume()
}
您必须使用 Foundation class、NSJSONSerialization 将您从 api 获得的 json 数据转换为对象。所以你可以使用下面的行:
let usableData = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
print(usableData)
你的代码没问题。如果要将 JSON 数据打印为字符串,则需要将字节从 data
转换为字符串:
if let usableData = data {
let str = String(bytes: data, encoding: .utf8)
print("\(String(describing: str))") // just for debug output
}
请注意,这不是解析所必需的,您可以按照
struct User: Codable {
let id: Int
let name, username, email: String
let address: Address
let phone, website: String
let company: Company
}
struct Address: Codable {
let street, suite, city, zipcode: String
let geo: Geo
}
struct Geo: Codable {
let lat, lng: String
}
struct Company: Codable {
let name, catchPhrase, bs: String
}
if let usableData = data {
try {
let user = try JSONDecoder().decode(User.self, from: data)
} catch {
print("\(error)"
}
}
为此