json - 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?
}
解决方案
首先,反斜杠是虚拟的。该框架将它们添加为能够print
在文字字符串中使用双引号。
其次dataTask
返回序列化的 JSON Data
,以便从您必须调用的数据中获取字典或数组jsonObject(with
。
let object = try JSONSerialization.jsonObject(with: data)
print(object)
推荐阅读
- ios - ios 获取位置 react-native/Expo
- javascript - 如何在 React Native 中创建无组织的网格视图
- c# - 缺少 C# Properties.Settings
- sapui5 - 以“标题”作为超链接的 SAP UI5 对象列表项
- snowflake-cloud-data-platform - 使用事务内的临时表调用存储过程
- nearprotocol - 如何验证在 Rust 智能合约测试中创建了正确的 Promise?
- javascript - script src 302 如何找出哪个链接重定向?
- c++ - 返回模板化实体的函数的概念
- python - Pandas 打破行并阻止 Google Data Studio 正确读取文件
- eclipse - 为什么其他代码有 Log4j 输出到控制台,而不是我的代码?