首页 > 解决方案 > JSON写入Swift 4中的顶级类型无效

问题描述

我正在尝试学习 JSON 解析。我在 Laravel 中编写了一个 API,它status : 200作为响应返回。我所做的是这样的:

guard let url = URL(string: "http://localhost/workon-api/public/api/register") else { return }

    var request  = URLRequest(url: url)

    request.httpMethod = "POST"

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")

    let newUser = User.init(name: "Rob", email: "abc@gmail.com", password: "12345678")

    do {

        let jsonBody = try JSONEncoder().encode(newUser)

        request.httpBody = jsonBody

    } catch { }

    URLSession.shared.dataTask(with: request) { (data, response, error) in

        guard let data = data else { return }

        do {

            let json = try JSONSerialization.data(withJSONObject: data, options: .prettyPrinted)

            print(json)

        } catch {}

    }.resume()

现在,我收到此错误:Invalid top-level type in JSON write应用程序崩溃。搜索后,我使用了这个:

let json = try JSONSerialization.jsonObject(with: data, options: [])

而且,它有效。为什么以前的方法不起作用?而且,如果我尝试返回收集的 userInfo,我会得到这样的响应。

status = "{\"name\":\"Rob\",\"email\":\"abc@gmail.com\",\"password\":\"12345678\"}";

为什么那里有反斜杠?这些还好吗?还有,什么是 Gzip 数据?我知道我问了很多,但我需要理解这一点。提前致谢。

PS:这是用户模型。

struct User: Encodable {

let name            : String?

let email           : String?

let password        : String?

}

标签: jsonswift

解决方案


首先,反斜杠是虚拟的。该框架将它们添加为能够print在文字字符串中使用双引号。

其次dataTask返回序列化的 JSON Data,以便从您必须调用的数据中获取字典或数组jsonObject(with

let object = try JSONSerialization.jsonObject(with: data)
print(object)

推荐阅读