← 전체 글

JSON 검증하는 방법: 문법과 스키마 검증

JSON.parse, Python의 json.loads, jq, 또는 브라우저로 JSON 문법 검증 —— 그리고 JSON Schema로 구조와 타입을 검사하는 법.

JSON 검증은 문자열이 구문적으로 올바른지(JSON 문법을 따르는지) 확인하고, 선택적으로 구조적으로 올바른지(애플리케이션이 기대하는 모양과 일치하는지) 확인하는 것을 의미합니다. 본 가이드는 JavaScript, Python, 명령행, 그리고 브라우저에서 JSON 을 검증하는 방법을 보여주고, 구문 검증과 스키마 검증의 결정적 차이를 설명합니다.

두 가지 JSON 검증

무엇을 검증하기 전에 실제로 던지고 있는 질문이 어느 쪽인지 결정하세요:

  • 구문 검증 —— "이것이 유효한 JSON 인가?" JSON 문법에 따라 따옴표, 콤마, 괄호, 값 타입을 검사합니다. JSON.parse() 가 이를 합니다.
  • 스키마 검증 —— "이 JSON 이 올바른 필드, 타입, 제약을 가졌는가?" id 가 정수인지, email 이 존재하는지 등을 확인합니다. JSON Schema 와 Ajv 같은 검증기가 필요합니다.

대부분의 "validate JSON" 검색은 구문 검증을 의미합니다 —— 거기부터 시작합시다.

JavaScript 에서 JSON 검증

가장 단순하고 신뢰할 수 있는 구문 검사는 파싱을 시도하고 오류를 잡는 것입니다. JSON.parse() 는 잘못된 입력에 SyntaxError 를 던집니다:

function isValidJson(text) {
  try {
    JSON.parse(text);
    return true;
  } catch {
    return false;
  }
}

isValidJson('{"name":"Ada"}');  // true
isValidJson("{'name':'Ada'}");  // false —— 작은따옴표
isValidJson('{"a":1,}');        // false —— 후행 콤마

문자열이 왜 무효한지 이유가 필요하면 오류 메시지를 보관하세요 —— 보통 위치가 포함됩니다:

function validateJson(text) {
  try {
    return { valid: true, value: JSON.parse(text) };
  } catch (err) {
    return { valid: false, error: err.message };
  }
}

validateJson('{"a":1,}');
// { valid: false, error: "Expected double-quoted property name in JSON at position 7" }

JSON 을 정규식으로 검증하지 마세요. JSON 은 재귀 문법이며 정규식으로 올바르게 검증할 수 없습니다 —— JSON.parse() 가 표준 검증기이며 모든 JavaScript 런타임에 내장되어 있습니다.

Python 에서 JSON 검증

Python 의 json.loads() 는 잘못된 입력에 json.JSONDecodeError 를 던지며 정확한 줄과 열을 제공합니다:

import json

def is_valid_json(text):
    try:
        json.loads(text)
        return True
    except json.JSONDecodeError as e:
        print(f"Invalid JSON: {e.msg} at line {e.lineno} column {e.colno}")
        return False

is_valid_json('{"name": "Ada"}')   # True
is_valid_json('{"name": "Ada",}')  # False —— 후행 콤마

명령행에서 JSON 파일 검증

jq 사용

jq 는 입력이 유효한 JSON 이 아니면 비영(non-zero) 상태로 종료하므로 스크립트와 CI 에 이상적입니다:

# 유효하면 아무것도 출력하지 않고 0 으로 종료; 무효하면 오류를 출력하고 비영으로 종료
jq empty data.json && echo "valid" || echo "invalid"

Python 사용(설치 불필요)

python3 -m json.tool data.json > /dev/null && echo "valid"

CI 파이프라인에서

리포의 모든 JSON 파일을 pre-commit 또는 CI 단계로 검증해 잘못된 설정이 프로덕션에 도달하지 않도록 하세요:

# .json 파일 중 하나라도 무효이면 빌드를 실패
find . -name '*.json' -not -path './node_modules/*' \
  -exec sh -c 'jq empty "$1" || exit 255' _ {} \;

브라우저에서 JSON 검증

코드 없이 빠르게 확인하려면 JSON 을 fixjson 의 JSON 검사기 에 붙여 넣으세요. 입력하는 동안 구문 오류의 정확한 줄과 위치를 즉시 보고하고, 모두 로컬에서 실행됩니다 —— 서버로 전송되지 않으므로 민감한 페이로드에도 안전합니다. JSON 이 깨졌고 단순 표시가 아니라 수리를 원한다면 JSON Fix 가 흔한 오류를 자동 수정합니다.

구문을 넘어: JSON Schema 로 구조 검증

구문상 유효한 JSON 도 애플리케이션에는 틀릴 수 있습니다 —— 필수 필드 누락, 숫자여야 하는 곳에 문자열, 범위를 벗어난 값. 구조를 강제하려면 JSON Schema 로 기대하는 모양을 기술하고 Ajv(JavaScript) 또는 jsonschema 라이브러리(Python)로 검증하세요:

import Ajv from 'ajv';

const ajv = new Ajv();
const validate = ajv.compile({
  type: 'object',
  required: ['id', 'email'],
  properties: {
    id:    { type: 'integer' },
    email: { type: 'string' },
  },
});

validate({ id: 42, email: 'a@b.com' }); // true
validate({ id: '42' });                 // false —— 타입 오류 & email 누락
// validate.errors 에 자세한 이유

명령행 스키마 검증

CI 에서 JSON 을 스키마에 대해 검증할 때 두 CLI 가 대부분의 요구를 충족합니다:

# Python —— 한 번 설치
pip install jsonschema
jsonschema --instance data.json schema.json && echo OK

# Node —— Ajv CLI
npm i -g ajv-cli ajv-formats
ajv validate -c ajv-formats -s schema.json -d "data.*.json"

커밋마다 JSON 검증(Pre-Commit 훅)

미검증 JSON 의 커밋을 원천 차단하려면 husky + lint-staged 로 훅 연결:

// package.json
{
  "lint-staged": {
    "*.json": [
      "jq empty",
      "ajv validate -s schemas/$name.schema.json -d"
    ]
  }
}

# 훅 설치
npx husky add .husky/pre-commit "npx lint-staged"

Python 프로젝트에서는 공식 pre-commit 프레임워크에 내장 check-json 훅이 있어 모든 스테이징 파일에 대해 json.loads 를 실행합니다.

흔한 JSON 검증 오류

검증이 실패할 때 원인은 거의 항상 이 중 하나입니다 —— 각각에 대한 전용 가이드가 있습니다:

자주 묻는 질문

문자열이 유효한 JSON 인지 확인하려면?

try/catch 안에서 JSON.parse()(JavaScript) 또는 try/except 안에서 json.loads()(Python)에 넘기세요. 던지지 않으면 유효합니다. 코드 없는 검사는 브라우저 검사기 를 쓰세요.

JSON 을 정규식으로 검증할 수 있나요?

안 됩니다. JSON 은 재귀 문법이며 정규식으로는 올바르게 표현할 수 없습니다. 항상 진짜 파서를 쓰세요 —— JSON.parse().

JSON 검증과 파싱의 차이는?

파싱은 텍스트를 사용 가능한 값으로 바꾸고, 검증은 단지 파싱이 가능한지 확인합니다. 실용적으로 성공적인 파싱이 검증입니다 —— 같은 동작이며 유효성만 신경 쓸 때 결과를 버리면 됩니다.

스키마에 대해 JSON 을 검증하려면?

JSON Schema 를 Ajv(JavaScript) 또는 jsonschema 라이브러리(Python)와 함께 사용하세요. 스키마 검증은 타입, 필수 필드, 제약을 확인합니다 —— 구문만이 아닙니다.

지금 JSON 검증 —— 설정 불필요

JSON 을 JSON 검사기 에 붙여 넣어 즉시 구문 오류와 정확한 줄·위치를 확인하세요. 모든 처리는 브라우저에서 일어나고 데이터는 기기를 떠나지 않습니다.

  • JSON 검사기 —— 브라우저에서 즉시 구문 검사
  • JSON Fix —— 무효한 JSON 수리, 단순 표시가 아님
  • JSON Schema 란? —— 구조와 타입 검증, 구문만이 아님
  • JSON 이란? —— JSON 을 유효/무효로 만드는 문법 규칙