UPGRADE YOUR SKILLS: Learn advanced Swift and SwiftUI on Hacking with Swift+! >>

SOLVED: JSON Decoding Error Using A Generic

Forums > Swift

I've come across a couple similar posts related to JSON decoding errors, but I think my problem is different enough to ask it:

Model

struct UserSLPForgotPasswordRequest: Codable {
    var email: String
}

struct UserSLPForgotPassword: Codable {
    let email: String
}

API Service Session/Encoding

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

            if data != nil { print(data!) }

            if response != nil { print(response!) }

            if error != nil { print(response!) }

            guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else {
                completion(.failure(.custom(errorMessage: "Non-200 Response")))
//                print(response!)
                return
            }
            guard let data = data, error == nil else {
                completion(.failure(.custom(errorMessage: "No Data")))
                return
            }
            self.decode(data: data, completion: completion)

        }.resume()

Generic Decoder

    private func decode<T: Decodable>(data: Data, completion: @escaping (Result<T, AuthenticationError>) -> Void) {
        do {
            let jsonDecoded = try JSONDecoder().decode(T.self, from: data)
            completion(.success(jsonDecoded))
        } catch (let error) {
            print(error)
            completion(.failure(.decodingError))
        }
    }

Somewhere inside the decoder function I recieve this error:

dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around line 1, column 0." UserInfo={NSDebugDescription=Invalid value around line 1, column 0., NSJSONSerializationErrorIndex=0})))

My back-end is working fine and sending me a 200 response, but I'm just not sure where the decoder is having its problems with the JSON.

I have only used the decoder with GET and POST requests that have multiple fields involved and this particular endpoint only receives a single field and technically isn't returning anything, so maybe it's something to do with that? IDK...

3      

Please post a sample of the JSON response. There is something in there the decoder doesn't like, right at the very beginning.

4      

Hey @roosterboy, you're right. The decoder is the problem, in that it's completely unneccessary :-)

I figured it out a bit later and the problem is I wasn't familiar with using Void() in place of the Decoders work for this particular endpoint; since it doesn't return any JSON, only a server response code.

So instead of

self.decode(data: data, completion: completion)

I just used

completion(.success(Void()))

And instead of being

Sad

I'm now

Glad

3      

BUILD THE ULTIMATE PORTFOLIO APP Most Swift tutorials help you solve one specific problem, but in my Ultimate Portfolio App series I show you how to get all the best practices into a single app: architecture, testing, performance, accessibility, localization, project organization, and so much more, all while building a SwiftUI app that works on iOS, macOS and watchOS.

Get it on Hacking with Swift+

Sponsor Hacking with Swift and reach the world's largest Swift community!

Archived topic

This topic has been closed due to inactivity, so you can't reply. Please create a new topic if you need to.

All interactions here are governed by our code of conduct.

 
Unknown user

You are not logged in

Log in or create account
 

Link copied to your pasteboard.