I not able to decode JSON data

Hello All, I am trying to create simple login and signup with php mysql in backend. I was following "https://github.com/EMacco/ios-tutorials/tree/yummie-network-connection/Yummie" this project"

I get the following error The response is: {"data":[{"response":"Success","username":"Mohammad Tariq Shamim"}]} Error Response could not be decoded

I am getting response from the server but JSON is not getting decoded. Following is my code

enum Route {

    static let baseurl = "http://arabscholar.net/android/"

    case login

    var description: String {

        switch self {

        case .login: return "login.php"

        }

    }

}

struct User: Decodable{     let username: String?     let response: String? }

struct NetworkService {

    static let shared = NetworkService()

    private init() {}

    func signin(username: String, password: String, completion: @escaping(Result<User, Error>) -> Void) {

        let params = ["login": "user", "email": username, "password": password]

            

        request(route: .login, method: .post, parameters: params, completion: completion)

    }

    

    private func request<T: Decodable>(route: Route, method: Method, parameters: [String: Any]? = nil, completion: @escaping(Result<T, Error>) -> Void) {

        guard let request = createRequest(route: route, method: method, parameters: parameters) else {

            completion(.failure(AppError.unknownError))

            return

        }

        

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

            var result: Result<Data, Error>?

            if let data = data {

                result = .success(data)

                let responseString = String(data: data, encoding: .utf8) ?? "Could not stringify our data"

                print("The response is: (responseString)")

            } else if let error = error {

                result = .failure(error)

                print("The error is " + error.localizedDescription)

            }

            

            DispatchQueue.main.async {

                self.handleResponse(result: result, completion: completion)

            }

            

        }.resume()

    }

    

    private func handleResponse<T: Decodable>(result: Result<Data, Error>?, completion: (Result<T, Error>) -> Void) {

        guard let result = result else {

            completion(.failure(AppError.unknownError))

            return

        }

            

        switch result {

        case .success(let data):

            let decoder = JSONDecoder()

            guard let response = try? decoder.decode(ApiResponse.self, from: data) else {

                completion(.failure(AppError.errorDecoding))

                return

            }

                

            if let error = response.error {

                completion(.failure(AppError.serverError(error)))

                return

            }

            

            if let decodedData = response.data {

                completion(.success(decodedData))

            } else {

                completion(.failure(AppError.unknownError))

            }

        case .failure(let error):

            completion(.failure(error))

        }

    }

    

    private func createRequest(route: Route, method: Method, parameters: [String: Any]? = nil) -> URLRequest? {

        let urlString = Route.baseurl + route.description

        guard let url = urlString.asUrl else {return nil}

        var urlRequest = URLRequest(url: url)

        urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")

        urlRequest.httpMethod = method.rawValue

        

        if let params = parameters {

            switch method {

            case .get:

                var urlComponent = URLComponents(string: urlString)

                urlComponent?.queryItems = params.map { URLQueryItem(name: $0, value: "($1)")}

                urlRequest.url = urlComponent?.url

            case .post:

                let bodyData = try?JSONSerialization.data(withJSONObject: params, options: [])

                urlRequest.httpBody = bodyData

            }

        }

        return urlRequest

    }

}

WHen you post code, please use Copy and Paste Style and also format with code formatter. Code will be much more readable.

There are a lot of missing information.

  • How is ApiResponse defined ?
  • Is the json : {"data":[{"response":"Success","username":"Mohammad Tariq Shamim"}]}
I not able to decode JSON data
 
 
Q