네트워크 요청을 통해 JSON 데이터를 가져올 때 Invalid JSON
오류가 발생할 수 있다.
이 문제는 보통 잘못된 API 응답, JSON 디코딩 문제, 네트워크 연결 오류 등으로 인해 발생한다.
이 글에서는 Invalid JSON 오류의 원인을 분석하고 해결하는 방법을 정리한다.
문제 상황
서버에서 JSON 데이터를 받아와 디코딩하려고 했을 때 다음과 같은 오류가 발생했다.
The data couldn’t be read because it isn’t in the correct format.
typeMismatch(Swift.Dictionary<...>, DecodingError.Context)
해결 방안
서버 응답이 JSON이 아닐 가능성
API가 반환하는 데이터가 JSON 형식이 아닐 경우 DecodingError가 발생할 수 있다.
API 응답을 직접 출력해서 JSON이 정상적인지 확인한다.
let task = URLSession.shared.dataTask(with: url) { data, response, error in if let data = data, let jsonString = String(data: data, encoding: .utf8) { print("Server Response: \(jsonString)") } } task.resume()
JSON 디코딩 시 key가 일치하지 않는 문제
API 응답의 JSON 키와 Swift 모델 구조가 다르면 디코딩 오류가 발생할 수 있다.
CodingKeys
를 사용하여 JSON의 키와 Swift 프로퍼티를 매칭한다.// 서버 응답 // { // "id": 1, // "username": "JohnDoe" // } struct User: Decodable { let id: Int let userName: String enum CodingKeys: String, CodingKey { case id case userName = "username" } }
서버 응답이 null을 포함하는 문제
서버에서 특정 필드가 null일 경우 디코딩이 실패할 수 있다.
옵셔널(?)을 사용하여 null을 허용한다.
struct User: Decodable { let id: Int let email: String? }
JSON 데이터가 예상보다 크거나 잘리는 문제
일부 API는 gzip 압축을 사용하기 때문에 데이터가 깨질 수 있다.
이럴 경우,
URLSession
의accept-Encoding
을 확인해야 한다.var request = URLRequest(url: url) request.setValue("gzip, deflate", forHTTPHeaderField: "Accept-Encoding")