JSON写入Swift 4中的***类型无效
Posted
技术标签:
【中文标题】JSON写入Swift 4中的***类型无效【英文标题】:Invalid top-level type in JSON write Swift 4 【发布时间】:2018-10-22 07:36:12 【问题描述】:我正在尝试学习 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 数据?我知道我问了很多,但我需要理解这一点。提前致谢。
附: : 这是用户模型。
struct User: Encodable
let name : String?
let email : String?
let password : String?
【问题讨论】:
我建议发布User
模型...
对于 JSON 中无效的***类型 write 。你可能需要看看这个问题***.com/questions/40200002/…
如果您正在学习,请改用Codeable
,Swift 中对 JSON 的内置支持非常好,并且被大多数人推荐。学习可能会过时的第三方框架是没有意义的。
@JoakimDanielson 他已经这样做了 :) let jsonBody = try JSONEncoder().encode(newUser)
表示他做到了。 PS:可能是Encodable
而不是Codable
...
JSONSerialization.data(withJSONObject:options)
: 第一个参数需要是 Dictionary 或 Array 对象。而JSONSerialization.jsonObject(with:options:)
等待Data
对象。你在滥用好电话。第一个:Swift Array or Dictionary => JSONStringTransformedInData,第二个 JSONStringTransformedInData => Swift Array or Dictionary
【参考方案1】:
首先,反斜杠是虚拟的。框架将它们添加为能够在文字字符串中使用 print
双引号。
其次,dataTask
返回序列化的 JSON Data
,因此要从数据中获取字典或数组,您必须调用 jsonObject(with
。
let object = try JSONSerialization.jsonObject(with: data)
print(object)
【讨论】:
好的,虽然我删除了这样的反斜杠let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
删除options
参数,就像我的回答一样。 无选项是默认设置。
No exact matches in call to class method 'jsonObject'
@AndorNémeth 此错误与 Swift 3 及更高版本中缺少 options
参数无关。以上是关于JSON写入Swift 4中的***类型无效的主要内容,如果未能解决你的问题,请参考以下文章
JSON 解析 --> Swift | JSON 写入中的***类型无效
Swift 中 JSON 写入(NSConcreteMutableData)中的类型无效
iOS 中的 JSON 错误:JSON 写入中的***类型无效