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中的***类型无效的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中写入 JSON 中的***类型无效

JSON 解析 --> Swift | JSON 写入中的***类型无效

Swift 中 JSON 写入(NSConcreteMutableData)中的类型无效

iOS 中的 JSON 错误:JSON 写入中的***类型无效

JSONSerialization JSON 写入中的类型无效 (_SwiftValue)

JSONSerialization JSON 写入中的类型无效 (_SwiftValue)