Xcode操场-Swift 4未接收JSON数据

Xcode操场-Swift 4未接收JSON数据,swift,swift4,swift-playground,Swift,Swift4,Swift Playground,您好,我在Xcode Playerly工作,试图使用URL会话和来自jsonplaceholder网站的虚拟数据来使用API http get请求 请参阅下面的代码。代码没有返回错误,但我希望“usableData”中有数据并打印出来。数据如下: {URL:}{状态代码:200,标题{\n“访问控制允许凭据”=(\n true\n);\n“CF缓存状态”=(\n HIT\n);\n“CF-RAY”=(\n“445f3d1003761d3e MEL”\n);\n“缓存控制”=(\n“公共,最大年龄

您好,我在Xcode Playerly工作,试图使用URL会话和来自jsonplaceholder网站的虚拟数据来使用API http get请求

请参阅下面的代码。代码没有返回错误,但我希望“usableData”中有数据并打印出来。数据如下:

{URL:}{状态代码:200,标题{\n“访问控制允许凭据”=(\n true\n);\n“CF缓存状态”=(\n HIT\n);\n“CF-RAY”=(\n“445f3d1003761d3e MEL”\n);\n“缓存控制”=(\n“公共,最大年龄=14400”\n);\n连接=(\n“保持活动”\n);\n“内容编码”=(\n gzip\n);\n“内容类型”=(\n“应用程序/json;字符集=utf-8”\n日期=(\n“2018年8月6日星期一05:52:38 GMT”\n);\n Etag=(\n“W/\”1fd-+2Y3G3W049ISZTW5T1MZSNUNGE\”\n);\n过期=(\n“2018年8月6日星期一09:52:38 GMT”\n);\n Pragma=(\n“无缓存”\n);\n Server=(\n cloudflare\n);\n“传输编码”=(\n标识\n);\n Vary=(\n“源,接受编码”\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"
    }
} 
在这个阶段,我只对获取数据感兴趣,而不是解析它

我做错了什么?欢迎任何帮助。谢谢

----起始代码---------------


您必须使用基础类、NSJSONSORLISTION来将从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)"
    }
}

为此

代码应该可以工作并打印“509字节”。如果let usableData是冗余的,那么可选绑定
。如果没有错误,
数据可以安全地展开。正确,我得到了509字节。我将尝试转换为可读的JSON。问题是关于Swift 4,我们有
可编码的
JSONDecoder
NSJSONSerialization
避免。好的,你能在我的代码中给我一个例子吗?我想coddle更多的是在获得数据后进行解析。我还没有。@Gereon请用我的代码给我一个例子。显然,
Codable
用于将JSON数据解析成实际的Swift对象。我已经用一个例子更新了我的答案。@RvE你怎么能接受这个答案?它甚至没有用Swift 4编译。请不要建议像
print(\(String(description:str))”)
这样的重言式语法。JSON数据中的字符串永远不能
nil
print(str!)
就足够了。代码中没有任何内容(据我所知,服务器上也没有)确实确保了JSON的参与。因此,我们不知道
数据中有多少字节,因此转换为字符串实际上可能会失败,这就是为什么我不愿意向初学者推荐强制展开。粘贴
http://jsonplaceholder.typicode.com/users/1
进入浏览器并查看。它是json。但我更关心的是打印一个带有字符串插值的字符串,该字符串是从一个带有
描述
初始值设定项的字符串创建的。除了在这个阶段编写的OP之外,我只对获取数据感兴趣,而不是对其进行解析。Vadian是正确的。这给出了结果..如果让usableData=data{let str=String(bytes:data!,encoding:.utf8)print(((str!))”//仅用于调试输出感谢您的帮助以及我在xcode游乐场中的尝试和错误。现在新的演变将被解析。
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)"
    }
}