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

iosSwift
avatar
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 압축을 사용하기 때문에 데이터가 깨질 수 있다.

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

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






- 컬렉션 아티클