• Feed
  • Explore
  • Ranking
/
/
    📱 iOS

    [iOS] API 요청 시 발생하는 ‘Invalid JSON’ 오류 해결 방법

    iosSwift
    지
    지성
    2025.02.19
    ·
    3 min read

    네트워크 요청을 통해 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)

    해결 방안

    1. 서버 응답이 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()
    2. 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"
            }
        }
    3. 서버 응답이 null을 포함하는 문제

      • 서버에서 특정 필드가 null일 경우 디코딩이 실패할 수 있다.

      • 옵셔널(?)을 사용하여 null을 허용한다.

        struct User: Decodable {
            let id: Int
            let email: String?
        }
    4. JSON 데이터가 예상보다 크거나 잘리는 문제

      • 일부 API는 gzip 압축을 사용하기 때문에 데이터가 깨질 수 있다.

      • 이럴 경우, URLSession의 accept-Encoding을 확인해야 한다.

        var request = URLRequest(url: url)
        request.setValue("gzip, deflate", forHTTPHeaderField: "Accept-Encoding")






    - 컬렉션 아티클