JSON 유효성 검사기
고급 온라인 JSON 구문 검사기 및 스키마 확인기 — 완전한 브라우저 기반, 개인정보 보호 우선.
즉시 JSON 유효성 검사
이 무료 온라인 JSON 검사기는 JSON 데이터의 문법 오류와 구조적 문제를 즉시 확인할 수 있도록 도와줍니다. 원시 API 응답, 구성 파일 또는 구조화된 페이로드를 검증할 때, 실시간으로 문제를 강조 표시하며 자동 수정 기능도 제공합니다. 더욱 엄격한 검증을 원한다면 JSON 스키마를 추가하여 필수 필드, 특정 유형, 이메일 및 URI 같은 형식 규칙을 적용할 수 있습니다. 이 도구는 JSON 스키마 Draft-07을 완벽하게 준수하며 모든 처리 과정은 브라우저 내에서 이루어져 사용자의 데이터는 절대 외부로 전송되지 않습니다.
JSON 유효성 검사란 무엇인가요?
JSON(자바스크립트 객체 표기법)은 널리 사용되는 경량 데이터 교환 형식으로, 사람이 읽기 쉽고 기계가 파싱 및 생성하기 용이하도록 설계되었습니다. 객체, 배열, 문자열, 숫자, 불리언, 널 값을 포함한 구조화된 데이터를 언어에 구애받지 않고 표현하는 데 주로 사용됩니다.
JSON 유효성 검사는 JSON 문서가 구문적으로나 구조적으로 올바른지 프로그래밍 방식으로 확인하는 과정입니다. 이는 두 가지 주요 측면을 점검하는 것을 포함합니다:
- 구문 유효성 검사: ECMA-404 JSON 명세에서 정의한 공식 문법을 원시 텍스트가 준수하도록 보장합니다. 대부분의 최신 프로그래밍 언어의 파서(예: JavaScript의 JSON.parse(), Python의 json.loads(), Java의 JSONDecoder)는 유효한 구문을 기대하며, 입력이 잘못되면 오류를 발생시킵니다.
- 구조(스키마) 검증: 구문을 넘어서, 스키마 검증은 JSON 데이터가 예상된 구조와 일치하는지 확인합니다. 여기에는 데이터 유형, 필수 속성, 값 제약 조건, 중첩된 객체 및 배열이 포함됩니다. 스키마 검증은 보통 유효한 데이터를 정의하는 규칙을 담고 있는 JSON 스키마를 사용하여 수행됩니다.
JSON을 검증해야 하는 이유는?
JSON 검증은 데이터 전송, 저장 또는 서비스 간 통신을 위해 직렬화되는 모든 경우에 매우 중요합니다. 주요 이유는 다음과 같습니다:
- 오류 방지: 데이터 처리 시도 전에 구문 오류(예: 누락된 쉼표, 짝이 맞지 않는 괄호, 허용되지 않는 문자)를 조기에 감지하고 보고합니다.
- 데이터 무결성 및 보안: 잘못된 형식이나 악의적인 JSON 페이로드를 차단하여 백엔드 충돌, 인젝션 공격, 데이터 손상을 방지합니다.
- 타입 안전성: 엄격한 타입 검사를 적용하여, 예를 들어 불리언이어야 하는 필드가 문자열로 전송되지 않도록 하며, UUID, 이메일, 숫자 등이 올바른 형식을 따르도록 보장합니다.
- 언어 간 호환성: 한 환경(예: Node.js)에서 생성된 JSON이 다른 환경(예: Python, Go, Java)에서 안전하게 사용될 수 있도록 보장하여 직렬화/역직렬화 오류를 방지합니다.
- 유지보수성 및 견고성: 검증된 데이터 구조는 추적성을 향상시키고 구성 파일, 로그, API 요청/응답에서 디버깅이 어려운 오류 발생 위험을 줄여줍니다.
- 개인정보 보호 및 보안: 검증은 완전히 클라이언트 측(브라우저 내)에서 수행되어, 원본 또는 민감한 데이터가 사용자 기기를 벗어나지 않고 안전하게 검증할 수 있습니다.
일반적인 JSON 유효성 검사 오류 (상세 예제 포함)
따옴표 없는 키
JSON 객체의 모든 키는 반드시 큰따옴표로 감싼 문자열이어야 합니다.
{ 이름: "앨리스" }
{ "name": "앨리스" }
많은 JSON 유사 형식(예: 자바스크립트 객체 리터럴)은 따옴표 없는 키를 허용하지만, 표준 JSON은 허용하지 않습니다.
따옴표
JSON 문자열은 반드시 큰따옴표(" ")만 사용해야 하며, 작은따옴표(' ')는 허용되지 않습니다.
{ 'name': '밥' }
{ "name": "밥" }
싱글 쿼트를 사용하면 모든 표준 JSON 라이브러리에서 파서 오류가 발생합니다.
후행 쉼표
객체나 배열의 마지막 항목 뒤에는 쉼표를 사용하지 마세요.
{ "a": 1, "b": 2, }
{ "a": 1, "b": 2 }
후행 쉼표는 자바스크립트에서는 동작할 수 있지만, 엄격한 JSON 파서에서는 작동하지 않습니다.
문자 이스케이프 처리 오류
문자열 내의 따옴표와 특수 문자는 역슬래시(\)를 사용해 이스케이프 처리해야 합니다.
{ "quote": "톰이 '안녕하세요'라고 말했어요" }
{ "quote": "Tom이 \"안녕하세요\"라고 말했어요" }
기타 이스케이프 시퀀스로는 백슬래시를 나타내는 \\ , 줄 바꿈을 위한 \n , 탭을 위한 \t 가 있습니다.
잘못된 데이터 유형
문자열은 숫자, 불리언 또는 null 값에 사용해서는 안 됩니다.
{ "enabled": "참", "count": "10" }
{ "enabled": true, "count": 10 }
JSON은 부울, 숫자, 문자열을 구분하므로 올바른 유형이 사용되도록 하세요.
비원시 키
JSON 객체의 키는 항상 문자열이어야 하며, 숫자, 불리언 또는 다른 유형을 키로 사용할 수 없습니다.
{ 123: "abc" }
{ "123": "abc" }
중복 키
JSON 명세에서는 허용되지만, 중복된 키는 흔히 버그의 원인이 됩니다.
{ "name": "앨리스", "name": "밥" }
대부분의 파서는 마지막 값("Bob")만 유지하고 이전 값들은 조용히 버립니다.
댓글 사용
표준 JSON은 일부 편집기가 지원하더라도 주석을 허용하지 않습니다.
{ // 사용자 정보 "name": "앨리스" }
{ "name": "앨리스" }
스키마 검증: 구조 및 데이터 유형 강제 적용
JSON 스키마는 JSON 문서의 기대 구조를 정의하고 검증하는 강력한 표준입니다. 이를 통해 다음을 지정할 수 있습니다:
- 필수 입력란 (`required`)
- 데이터 타입 (`type`: 문자열, 숫자, 불리언, 객체, 배열, 널)
- 문자열 형식(`format`: 이메일, UUID, 날짜-시간 등)
- 문자열 패턴 매칭 (`pattern`)
- 숫자 범위(`최소값`, `최대값`)
- 배열 길이 및 항목 유효성 검사(`minItems`, `maxItems`, `items`)
- 객체 및 배열에 대한 중첩 검증
- 열거형 제약조건 (`enum`)
예시: 사용자 스키마 (초안-07)
{ "type": "object", "properties": { "id": { "type": "string", "format": "uuid" }, "name": { "type": "string", "minLength": 1 }, "email": { "type": "string", "format": "email" }, "is_active": { "type": "boolean" } }, "required": ["id", "name", "email"], "additionalProperties": false }
이것이 적용하는 내용:
- id는 유효한 UUID 문자열이어야 합니다.
- 이름은 빈 문자열이 아닌 유효한 문자열이어야 합니다.
- 이메일은 표준 이메일 형식과 일치해야 합니다.
- is_active (선택 사항)은 불리언(boolean) 값이어야 합니다.
- 위에 정의된 속성 외에는 허용되지 않습니다.
실제 사례: Stripe API 응답 검증하기
Stripe API(예: PaymentIntent)에서 JSON 응답을 받는다고 가정해 보세요. 스키마 검증을 통해 불완전하거나 잘못된 타입의 데이터를 처리하지 않도록 할 수 있습니다.
{ "type": "객체", "properties": { "id": { "type": "문자열", "pattern": "^pi_" }, "object": { "type": "문자열", "const": "payment_intent" }, "amount": { "type": "정수", "minimum": 1 }, "currency":{ "type": "문자열", "minLength": 3, "maxLength": 3 }, "status": { "type": "문자열", "enum": [ "requires_payment_method", "requires_confirmation", "processing", "succeeded", "canceled" ]} }, "required": ["id", "object", "amount", "currency", "status"], "additionalProperties": false }
- id는 반드시 "pi_"로 시작해야 합니다
- 객체는 항상 "payment_intent"여야 합니다
- 금액은 1 이상인 정수여야 합니다
- 통화는 세 글자의 문자열이어야 합니다 (예: "usd", "eur")
- 상태는 지정된 값 중 하나여야 합니다
혜택
- 조기 오류 감지: 비즈니스 로직에 도달하기 전에 중대한 API 변경 사항이나 불완전한 데이터를 사전에 발견하세요.
- 자동화 테스트: CI/CD 파이프라인에서 스키마를 사용하여 실제 및 모의 응답을 검증하세요.
- 팀 간 일관성 확보: 프론트엔드, 백엔드 및 타사 API 간 데이터 계약 표준화
적절한 JSON 검증은 구문과 스키마 모두를 포함하며, 미묘한 버그를 방지하고 모범 사례를 적용하며, 잘못되었거나 악의적인 입력으로부터 애플리케이션을 보호합니다. 구성 파일, API 페이로드 또는 서비스 간 메시징에 사용되든, 강력한 검증은 현대 소프트웨어 시스템의 기초입니다.
개인정보 보호 및 보안
모든 검증 및 스키마 검사는 브라우저 내에서 로컬로 실행됩니다. 데이터는 업로드되거나 기록되지 않으며, JSON은 완전히 비공개로 유지됩니다.
JSON 검증을 위한 코드 예제
내장 라이브러리 또는 인기 프레임워크를 활용하여 다양한 프로그래밍 언어에서 JSON을 효율적으로 검증하는 방법을 알아보세요. 이 예제들은 구문 검증과 스키마 검증을 모두 포함하여 신뢰성 높은 데이터 처리법을 제공합니다.
const jsonString = '{"name":"Alice","age":30}';
try {
const obj = JSON.parse(jsonString);
console.log("Valid JSON:", obj);
} catch (e) {
console.error("Invalid JSON!", e.message);
}
const Ajv = require("ajv");
const ajv = new Ajv();
const schema = { type: "object", properties: { age: { type: "integer" } }, required: ["age"] };
const data = { age: 30 };
const validate = ajv.compile(schema);
console.log(validate(data) ? "Valid!" : ajv.errorsText(validate.errors));
import json
try:
obj = json.loads('{"name":"Alice","age":30}')
print("Valid JSON:", obj)
except json.JSONDecodeError as e:
print("Invalid JSON:", e)
import json, jsonschema
schema = {
"type": "object",
"properties": { "age": { "type": "integer" } },
"required": ["age"]
}
data = {"age": 30}
try:
jsonschema.validate(data, schema)
print("Valid!")
except jsonschema.ValidationError as e:
print("Schema validation error:", e)
package main
import (
"encoding/json"
"fmt"
)
func main() {
data := []byte(`{"name":"Alice","age":30}`)
var obj map[string]interface{}
if err := json.Unmarshal(data, &obj); err != nil {
fmt.Println("Invalid JSON:", err)
} else {
fmt.Println("Valid JSON:", obj)
}
}
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
public static void main(String[] args) {
String json = "{"name":"Alice","age":30}";
try {
Object obj = new ObjectMapper().readTree(json);
System.out.println("Valid JSON: " + obj);
} catch (Exception e) {
System.out.println("Invalid JSON: " + e.getMessage());
}
}
}
using System;
using System.Text.Json;
class Program {
static void Main() {
string json = "{"name":"Alice","age":30}";
try {
var doc = JsonDocument.Parse(json);
Console.WriteLine("Valid JSON!");
} catch (JsonException e) {
Console.WriteLine("Invalid JSON: " + e.Message);
}
}
}
<?php
$json = '{"name":"Alice","age":30}';
$obj = json_decode($json);
if (json_last_error() === JSON_ERROR_NONE) {
echo "Valid JSON";
} else {
echo "Invalid JSON: " . json_last_error_msg();
}
require 'json'
begin
obj = JSON.parse('{"name":"Alice","age":30}')
puts "Valid JSON!"
rescue JSON::ParserError => e
puts "Invalid JSON: #{e.message}"
end
echo '{"name":"Alice","age":30}' | jq empty && echo "Valid" || echo "Invalid"
fn main() {
let data = r#"{"name":"Alice","age":30}"#;
match serde_json::from_str::<serde_json::Value>(data) {
Ok(_) => println!("Valid JSON!"),
Err(e) => println!("Invalid JSON: {}", e),
}
}
import org.json.JSONObject
fun main() {
try {
val obj = JSONObject("{\"name\":\"Alice\",\"age\":30}")
println("Valid JSON: $obj")
} catch (e: Exception) {
println("Invalid JSON: ${e.message}")
}
}
import Foundation
let json = "{\"name\":\"Alice\",\"age\":30}"
if let data = json.data(using: .utf8) {
do {
let _ = try JSONSerialization.jsonObject(with: data)
print("Valid JSON!")
} catch {
print("Invalid JSON: \(error)")
}
}
const jsonString = '{"name":"Alice","age":30}';
try {
const obj = JSON.parse(jsonString);
console.log("Valid JSON:", obj);
} catch (e) {
console.error("Invalid JSON!", e.message);
}
SELECT '{"name":"Alice","age":30}'::jsonb; -- Will error if not valid JSON
SELECT JSON_VALID('{"name":"Alice","age":30}');
$json = '{"name":"Alice","age":30}'
try {
$obj = $json | ConvertFrom-Json
Write-Output "Valid JSON!"
} catch {
Write-Output "Invalid JSON: $($_.Exception.Message)"
}
use JSON;
my $str = '{"name":"Alice","age":30}';
eval { decode_json($str) };
print $@ ? "Invalid JSON: $@" : "Valid JSON!";
import 'dart:convert';
void main() {
const jsonString = '{"name":"Alice","age":30}';
try {
final obj = jsonDecode(jsonString);
print('Valid JSON: $obj');
} catch (e) {
print('Invalid JSON: $e');
}
}
json = ~s({"name":"Alice","age":30})
case Jason.decode(json) do
{:ok, _} -> IO.puts("Valid JSON!")
{:error, err} -> IO.puts("Invalid JSON: #{err}")
end
import play.api.libs.json._
object Main extends App {
val str = """{"name":"Alice","age":30}"""
try {
val json = Json.parse(str)
println("Valid JSON!")
} catch {
case e: Exception => println("Invalid JSON: " + e.getMessage)
}
}
이 도구에 대하여
이 도구는 전 세계 수백만 명이 사용하는 빠르고 개인정보 보호를 최우선으로 하는 다양한 온라인 유틸리티를 제작하는 잇셀프 툴즈(Itself Tools) 팀에 의해 개발되었습니다. 간단함, 속도, 신뢰성을 우선시하는 브라우저 기반 도구 개발 경험을 바탕으로, 프로그래머, 분석가 및 디지털 전문가들이 기술 작업을 더 쉽게 수행할 수 있도록 설계된 개발자 중심 애플리케이션으로 확장하였습니다.