Swift에서 JSON 디코딩 오류와 해결 방법

2024. 12. 6. 11:10GPT는 블로그 글도 써준다

GPT는 블로그 글도 써준다.

 

Swift로 API를 연동할 때 JSONDecoder를 사용하여 서버에서 반환된 데이터를 디코딩할 수 있습니다. 하지만 JSON 데이터와 구조체 간의 매핑이 일치하지 않을 경우 DecodingError가 발생합니다. 이번 글에서는 이러한 오류를 해결하는 방법을 알아봅니다.


예제 상황

다음과 같은 JSON 데이터가 서버에서 반환된다고 가정합니다:

{
  "imageUrl": "https://example.com/image.png",
  "status": "SUCCESS"
}

이 JSON 데이터를 Swift의 구조체로 디코딩하려고 합니다.


오류 상황

다음과 같이 구조체를 정의했다고 가정해 봅시다:

struct ApiResponse: Decodable {
    let result: Result

    struct Result: Decodable {
        let imageUrl: String
        let status: String
    }
}

이 구조체를 사용하여 JSON 데이터를 디코딩하면 다음과 같은 오류가 발생합니다:

keyNotFound(CodingKeys(stringValue: "result", intValue: nil),
Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"result\", intValue: nil) (\"result\").", underlyingError: nil))

오류 원인

위 오류는 JSON 데이터의 구조와 Swift 구조체의 정의가 일치하지 않기 때문에 발생합니다.

  • JSON 데이터에는 result라는 키가 없으며, imageUrlstatus가 최상위 레벨에 있습니다.
  • 그러나 ApiResponse 구조체는 result라는 키 아래에 imageUrlstatus가 있다고 가정하고 있습니다.

해결 방법

JSON 데이터의 구조와 구조체 정의를 일치시키면 문제를 해결할 수 있습니다. 위 상황에서는 구조체를 다음과 같이 수정해야 합니다:

struct ApiResponse: Decodable {
    let imageUrl: String
    let status: String
}

수정된 구조체는 imageUrlstatus를 최상위 레벨에서 직접 매핑합니다.


수정 후 디코딩 코드

JSON 데이터를 디코딩하는 코드는 다음과 같습니다:

import Foundation

let jsonData = """
{
  "imageUrl": "https://example.com/image.png",
  "status": "SUCCESS"
}
""".data(using: .utf8)!

do {
    let response = try JSONDecoder().decode(ApiResponse.self, from: jsonData)
    print("Image URL: \(response.imageUrl)")
    print("Status: \(response.status)")
} catch {
    print("Decoding error: \(error)")
}

출력 결과

Image URL: https://example.com/image.png
Status: SUCCESS

JSON 구조와 Swift 구조체 매핑의 중요성

Swift에서 JSON 데이터를 다룰 때, 구조체 정의는 서버 응답 데이터와 정확히 일치해야 합니다. 그렇지 않으면 디코딩에 실패합니다. 이를 방지하려면 다음 사항을 유의하세요:

  1. JSON 구조 분석: 서버에서 반환하는 JSON 데이터를 먼저 분석하고, 정확히 일치하는 구조체를 설계합니다.
  2. 옵셔널 필드 처리: 특정 키가 항상 포함되지 않을 경우 해당 키를 옵셔널로 정의합니다. 예:
    let optionalField: String?
  3. Nested JSON 처리: 중첩된 JSON 데이터를 처리해야 한다면 CodingKeys를 사용하거나, 중첩 구조체를 정의합니다.

예를 들어, 중첩된 JSON 데이터가 다음과 같다면:

{
  "data": {
    "imageUrl": "https://example.com/image.png",
    "status": "SUCCESS"
  }
}

구조체는 다음과 같이 설계할 수 있습니다:

struct ApiResponse: Decodable {
    let data: DataClass

    struct DataClass: Decodable {
        let imageUrl: String
        let status: String
    }
}

이처럼 서버 응답 데이터 구조에 따라 적절히 구조체를 설계하면 디코딩 오류를 방지할 수 있습니다.


결론

Swift에서 JSON 데이터를 디코딩할 때는 서버 응답 구조와 일치하는 구조체를 설계하는 것이 중요합니다. 만약 구조가 일치하지 않는다면, DecodingError가 발생할 수 있으므로, JSON 데이터를 먼저 분석한 후 구조체를 설계하세요. 이를 통해 안정적인 API 연동을 구현할 수 있습니다.

반응형