Rob13
Rob13

Reputation: 381

Invalid top-level type in JSON write Swift 4

I am trying to learn JSON parsing. I have written an API in Laravel, which returns status : 200 in response. What I did is this:

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: "[email protected]", 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()

Now, I am getting this error: Invalid top-level type in JSON write and app's crashing. After searching, I used this:

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

And, it works. Why the previous method is not working? And, I get a response like this if I try to return the collected userInfo.

status = "{\"name\":\"Rob\",\"email\":\"[email protected]\",\"password\":\"12345678\"}";

Why are back-slashes there? Are these okay? And, what is Gzip data? I know I am asking a lot, but I need to understand this. Thanks in advance.

P.S. : Here is the User Model.

struct User: Encodable {

let name            : String?

let email           : String?

let password        : String?

}

Upvotes: 0

Views: 6222

Answers (1)

vadian
vadian

Reputation: 285039

First of all the backslashes are virtual. The framework adds them to be able to print double quotes within a literal string.

Secondly dataTask returns serialized JSON Data so to get a dictionary or array from the data you have to call jsonObject(with.

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

Upvotes: 2

Related Questions