JSON.DecodeError 예외
JSON.DecodeError 예외
JSON.DecodeError는 JSON 문자열을 Elixir 데이터 구조로 바꿀 때, 즉 디코딩 과정에서 실패하면 던져지는 예외예요. JSON.decode!/1이 잘못된 JSON을 만나면 이 예외를 던져요.
iex> JSON.decode!("{잘못된 JSON}")
** (JSON.DecodeError) ...
출처: JSON.DecodeError
본문
JSON.DecodeError는 오직 JSON.decode!/1에 의해서 던져지는 예외입니다. JSON.decode!/1은 JSON 문자열을 하나의 데이터 구조(맵, 리스트, 정수, 문자열 등)로 변환해 주는데, 입력이 올바른 JSON이 아니면 이 예외로 실패를 알려줘요.
iex> JSON.decode!("{\"a\": 1}")
%{"a" => 1}
iex> JSON.decode!("not json")
** (JSON.DecodeError) ...
!이 붙은 함수답게, 실패 가능성을 예외로 드러내요. 예외가 나지 않게 하고 싶다면 실패를 튜플로 돌려주는 JSON.decode/1을 쓰면 되고, 어차피 에러를 조기 처리하고 싶은 흐름이라면 예외를 그대로 rescue로 잡아도 돼요.
JSON.DecodeError에는 디코딩 과정의 어떤 부분이 잘못됐는지를 알려주는 정보가 담겨요. 대표적으로 잘못된 문법(예: 콜론이나 쉼표 위치), 문자열 안의 제어 문자, 깨진 숫자 형식, 예상과 다른 값의 타입 등이 원인이에요.
외부 API 응답처럼 신뢰할 수 없는 JSON을 다룰 때는 실패 가능성을 반드시 염두에 두어야 해요. JSON.decode!/1은 실패 시 예외를, JSON.decode/1은 {:ok, value} 또는 {:error, reason} 튜플을 돌려준답니다. 예외를 잡아서 사용자에게 읽기 좋은 메시지로 변환하거나, 튜플 분기로 우아하게 복구할 수 있어요.
인코딩한 값을 다시 디코딩하는 왕복(round-trip) 테스트에서도 이 예외를 자주 만나는데, 보통은 JSON에서 지원하지 않는 값(예: 아톰)을 인코딩하려다 생긴 문제가 디코딩에서 드러나는 경우가 많아요.
더 알아보기
JSON.decode!/1: JSON 문자열을 디코딩해 실패 시JSON.DecodeError를 던지는 함수JSON모듈: JSON 인코딩·디코딩 전반을 담당하는 Elixir 표준 모듈JSON.Encoder: 값을 JSON 문자열로 인코딩하는 프로토콜