JSON 데이터 다루는 법 - 파싱부터 가공까지 실무 완벽 가이드
개발 입문자도 따라할 수 있는 JSON 데이터 다루는 법을 자바스크립트, 파이썬 예제와 함께 정리했습니다. 자주 발생하는 오류 해결법도 포함.
![]()
API 응답을 받았는데 갑자기 화면이 멈추거나, 분명히 데이터가 있는데 undefined가 뜬 경험 한 번쯤 있으실 겁니다. 대부분은 JSON 데이터를 제대로 다루지 못해 생기는 문제입니다. 형식 자체는 단순한데, 실무에서는 의외로 함정이 많습니다.
JSON은 2001년 더글라스 크록포드가 정리한 이후 사실상 모든 웹 API의 표준이 되었습니다. 가볍고, 사람이 읽기 쉽고, 거의 모든 언어가 기본 지원합니다. 그래서 JSON 데이터 다루는 법은 개발자뿐 아니라 데이터를 분석하거나 자동화를 시도하는 누구에게나 필수 기술이 되었습니다.
JSON이 왜 표준이 되었을까
JSON은 JavaScript Object Notation의 약자입니다. 이름과 달리 자바스크립트 전용이 아닙니다. 파이썬, 자바, Go, Rust 등 거의 모든 언어에서 그대로 읽고 쓸 수 있습니다.
XML이 한때 데이터 교환 표준이었지만, 태그가 길고 파싱이 무거워서 점점 밀려났습니다. JSON은 같은 데이터를 표현해도 용량이 30~50% 적습니다. 모바일 환경에서 네트워크 비용을 줄여야 하는 상황과 잘 맞아떨어졌습니다.
| 형식 | 가독성 | 용량 | 파싱 속도 | 주요 사용처 |
|---|---|---|---|---|
| JSON | 높음 | 작음 | 빠름 | 웹 API, 설정 파일 |
| XML | 중간 | 큼 | 느림 | 레거시 시스템 |
| CSV | 매우 높음 | 매우 작음 | 매우 빠름 | 표 데이터 |
| YAML | 매우 높음 | 중간 | 중간 | 설정 파일 |
JSON 데이터 다루는 법 기본 구조
JSON은 두 가지 구조만 기억하면 됩니다. 객체(중괄호)와 배열(대괄호)입니다. 키는 반드시 큰따옴표로 감싸야 하고, 값은 문자열, 숫자, 불린, null, 객체, 배열 중 하나여야 합니다.
{
"name": "홍길동",
"age": 32,
"isActive": true,
"hobbies": ["독서", "방송"],
"address": {
"city": "서울",
"zip": "06000"
}
}여기서 가장 많이 실수하는 부분을 정리하면 다음과 같습니다.
- 키에 작은따옴표를 쓰면 안 됩니다. 반드시 큰따옴표여야 합니다
- 마지막 항목 뒤에 쉼표를 붙이면 파싱 오류가 납니다 (trailing comma 금지)
- 주석은 지원하지 않습니다. 설정 파일용 JSON5나 JSONC는 별도 규격입니다
- 숫자에 앞자리 0을 쓸 수 없습니다. 0123은 무효입니다
자바스크립트에서 JSON 파싱하기
자바스크립트에는 JSON.parse와 JSON.stringify가 내장되어 있습니다. 외부 라이브러리 없이 바로 쓸 수 있습니다.
문자열을 객체로 변환하기
const text = '{"name":"홍길동","age":32}';
const obj = JSON.parse(text);
console.log(obj.name); // 홍길동객체를 문자열로 변환하기
const data = { name: "홍길동", age: 32 };
const text = JSON.stringify(data, null, 2);
// 두 번째 인자는 replacer, 세 번째 인자는 들여쓰기실무에서 자주 쓰는 패턴은 try catch로 감싸는 것입니다. 잘못된 JSON이 들어오면 즉시 예외가 발생해 앱 전체가 멈출 수 있기 때문입니다.
let result;
try {
result = JSON.parse(input);
} catch (e) {
result = null;
console.error('JSON 파싱 실패:', e.message);
}JSON.parse는 단순히 문자열을 객체로 바꾸는 함수가 아닙니다. 외부에서 들어오는 모든 데이터의 첫 번째 방어선입니다. 예외 처리를 빼먹는 순간 서비스 전체가 한 번의 오타에 멈출 수 있습니다.
파이썬에서 JSON 처리하기
파이썬은 json 모듈을 표준 라이브러리로 제공합니다. 별도 설치 없이 import만 하면 됩니다.
import json
# 문자열 -> 딕셔너리
data = json.loads('{"name":"홍길동","age":32}')
# 딕셔너리 -> 문자열
text = json.dumps(data, ensure_ascii=False, indent=2)
# 파일 입출력
with open('data.json', 'r', encoding='utf-8') as f:
config = json.load(f)
with open('output.json', 'w', encoding='utf-8') as f:
json.dump(config, f, ensure_ascii=False, indent=2)한국어를 다룰 때 ensure_ascii=False 옵션을 빠뜨리면 결과 파일에 \uc11c\uc6b8처럼 유니코드 이스케이프 형태로 저장됩니다. 사람이 읽기 어렵고 용량도 늘어납니다.
자주 발생하는 JSON 오류와 해결
현장에서 가장 많이 마주치는 오류 패턴을 정리했습니다.
- Unexpected token: 키에 작은따옴표를 썼거나, 값 사이에 쉼표가 빠진 경우입니다
- Unexpected end of JSON input: 응답이 잘려서 도착했거나, 빈 문자열을 파싱하려고 했을 때 발생합니다
- Maximum call stack size exceeded: 순환 참조 객체를 stringify할 때 나타납니다. WeakSet으로 방문 추적이 필요합니다
- SyntaxError: Unexpected character: BOM(Byte Order Mark)이 파일 앞에 붙어 있는 경우입니다. UTF-8 with BOM으로 저장된 파일에서 자주 발생합니다
실제로 작은 유틸리티 사이트들은 내부적으로 JSON을 활발하게 사용합니다. 예를 들어 단위 변환기 같은 도구는 단위별 환산 비율을 JSON으로 관리하면 코드 수정 없이 데이터만 갱신할 수 있습니다. 연봉 실수령액 계산기도 매년 바뀌는 4대보험 요율과 소득세율 표를 JSON으로 두면 유지보수가 훨씬 수월해집니다. 작은 도구일수록 데이터와 로직을 분리하는 설계가 빛을 발합니다.
JSON 검증과 보안 체크 포인트
외부에서 들어온 JSON을 그대로 신뢰하면 안 됩니다. 특히 사용자 입력이나 외부 API 응답은 항상 검증해야 합니다.
스키마 검증
자바스크립트에서는 Ajv, 파이썬에서는 pydantic이나 jsonschema 라이브러리를 많이 씁니다. 필드 누락, 타입 불일치, 값 범위 초과 같은 문제를 미리 잡아낼 수 있습니다.
크기 제한
거대한 JSON을 받으면 메모리가 부풀어 서버가 죽을 수 있습니다. 서버 단에서 요청 크기를 1MB 같은 적정선으로 제한하세요. Express라면 express.json({ limit: '1mb' }) 같이 설정합니다.
민감 정보 노출
로그를 찍을 때 JSON 전체를 그대로 출력하면 비밀번호, 토큰, 주민번호가 그대로 남을 수 있습니다. 직렬화 전에 민감 필드를 마스킹하는 헬퍼 함수를 만들어두면 사고를 막을 수 있습니다.
JSON 데이터 다루는 법은 결국 두 가지로 요약됩니다. 첫째, 형식이 맞는지 항상 의심하고 예외 처리하기. 둘째, 들어오는 데이터를 검증하고 나가는 데이터를 정리하기. 다음 작업에서 JSON을 만지게 된다면 try catch와 스키마 검증부터 챙겨보시기 바랍니다.