JSON 포맷터

빠르고 무료이며 안전한 온라인 JSON 포맷터.

아래에 JSON을 포맷하세요

즉시 결과를 제공하는 빠른 온라인 JSON 포맷팅. 행 번호와 구문 강조 기능이 있는 현대적이고 개발자 친화적인 편집기를 경험하세요. 모든 작업은 빠르고 개인적으로 브라우저 내에서 이루어집니다.

JSON 포맷팅이란?

JSON 포맷팅은 들여쓰기, 공백, 줄바꿈을 추가하여 JSON 데이터를 일관되고 사람이 읽기 쉬운 형식으로 변환하는 과정입니다. 구조나 내용을 변경하지 않고, 적절한 포맷을 통해 JSON을 쉽게 검사, 디버그, 공유 및 편집할 수 있으며, 기계 및 소프트웨어 도구와의 호환성도 유지합니다.

정의상 JSON은 문자열 외의 공백을 무시합니다. 하지만 들여쓰기가 없거나 한 줄로 압축된 잘못된(또는 축소된) JSON은 사람이 읽거나 신뢰성 있게 수정하기 거의 불가능할 수 있습니다.

JSON 포맷팅과 축소의 차이

  • 포맷팅은 명확성과 가독성을 위해 공백, 들여쓰기, 줄바꿈을 추가합니다.
  • 축소는 최대한의 간결함과 저장 또는 전송 효율을 위해 불필요한 공백을 모두 제거합니다.
  • 견고한 JSON 포맷터는 이 두 모드를 전환할 수 있어 사람이 읽기 편한 버전과 기계 최적화 버전 사이를 쉽게 오갈 수 있습니다.

예시: 축소된 JSON과 포맷된 JSON 비교

축소된(간결한) JSON:
{"id":"3f4b2c","user":{"name":"Dana","is_active":true},"roles":["admin","editor"],"count":7}
포맷된(예쁘게 출력된) JSON:
{
  "id": "3f4b2c",
  "user": {
    "name": "Dana",
    "is_active": true
  },
  "roles": [
    "admin",
    "editor"
  ],
  "count": 7
}

왜 JSON을 포맷해야 할까요?

  • 가독성: 적절한 들여쓰기와 줄바꿈은 중첩된 객체를 쉽게 검사하고 오류를 발견하며 복잡한 데이터 구조를 한눈에 이해할 수 있게 합니다.
  • 디버깅: 잘못되거나 예상치 못한 데이터를 시각적으로 확인하고 키, 값, 중첩 수준을 추적하기가 훨씬 쉽습니다.
  • 협업: 잘 포맷된 JSON은 코드 리뷰, 문서화, 공유 파일에서 검토, 토론, 편집하기 쉬워집니다.
  • 버전 관리: Git 등 VCS 도구는 포맷된 JSON으로 더 의미 있는 차이점(diffs)을 생성하여 변경 사항 추적을 용이하게 합니다.
  • 준수: Prettier, ESLint, jq 같은 많은 스타일 가이드와 자동 린터는 명확성과 표준화를 위해 일관된 포맷을 강제합니다.
  • 도구 호환성: 일부 API, CLI, 편집기는 사람이 읽기 쉽거나 로깅을 위해 포맷된 입력을 기대합니다.

JSON 포맷터는 어떻게 작동할까요?

  1. 파싱: 포맷터는 먼저 엄격한 JSON 파서를 사용해 입력을 파싱하며, 이 단계에서 누락된 따옴표, 후행 쉼표, 이스케이프되지 않은 문자 같은 구문 오류를 잡습니다.
  2. 예쁘게 출력: 유효한 경우, 파싱된 데이터를 사용자 지정 들여쓰기(주로 2 또는 4칸 공백)와 줄바꿈을 포함해 다시 문자열로 직렬화하여 "예쁘게 출력"된 버전을 만듭니다.

입력이 유효하지 않으면, 포맷터는 오류를 발생시키거나 문제의 위치와 원인을 사용자에게 알려주는 유용한 메시지를 제공합니다.

포맷 옵션

  • 들여쓰기: 레벨별 공백 개수 설정 (최대 8)
  • 객체 키를 알파벳 순으로 정렬
  • 들여쓰기에 공백 대신 탭 사용
  • 비ASCII 문자를 유니코드 이스케이프 처리
  • 출력을 축소 (한 줄, 공백 없음)

포맷팅으로 해결할 수 있는 일반 문제

  • 단일 행/축소 JSON: API나 로그 파일에서 반환된 데이터는 대역폭 효율을 위해 축소되어 수동 편집이 어렵습니다. 포맷팅을 통해 가독성을 복원하여 검토와 편집이 가능해집니다.
  • 들여쓰기 불일치: 다양한 출처에서 붙여넣은 JSON은 탭, 공백 혼용이나 들여쓰기 깊이 불일치가 있을 수 있습니다. 재포맷팅으로 차이를 정규화하여 명확성과 일관성을 높입니다.
  • 대규모/중첩 구조: 깊게 중첩된 배열이나 객체(설정 파일이나 복잡한 API 응답 등)는 포맷팅 시 탐색이 쉽고, 지원하는 편집기에서는 접기 기능도 활용할 수 있습니다.

실전 사례: API 응답 포맷팅

AWS, Stripe, Google Cloud 같은 서드파티 API와 통합할 때 응답은 속도를 위해 압축되어 있는 경우가 많습니다. JSON 출력을 포맷팅하면 누락된 필드를 확인하고, 예상치 못한 값을 디버그하며, 팀과 공유하기가 용이해집니다.

예시: 원시 API 응답
{"amount":2500,"currency":"usd","status":"succeeded","charges":[{"id":"ch_1Gq","amount":2500}]}
검토용 포맷팅 결과
{
  "amount": 2500,
  "currency": "usd",
  "status": "succeeded",
  "charges": [
    {
      "id": "ch_1Gq",
      "amount": 2500
    }
  ]
}

이 도구로 JSON을 포맷하는 방법

  1. 원시, 축소되었거나 서식이 맞지 않는 JSON을 입력 영역에 붙여넣거나 업로드하세요.
  2. 들여쓰기 크기, 키 정렬 등 포맷 옵션을 선택하세요.
  3. "포맷" 버튼을 클릭해 입력을 처리하세요.
  4. 정리되고 읽기 쉬운 결과물을 확인하거나 복사하세요. 오류가 발견되면 상세한 구문 메시지가 나타나 JSON 수정에 도움을 줍니다.

모든 포맷 작업은 안전하게 브라우저 내에서 수행되어 데이터가 기기를 벗어나지 않습니다.

JSON 포맷팅을 위한 코드 예제

다양한 프로그래밍 언어에서 JSON을 포맷하는 방법을 확인해보세요. 이 예제들은 기본적인 포맷팅 기술을 설명합니다.

JavaScript (Node.js)
Install: Standard library
const ugly = '{"name":"Alice","age":30,"roles":["admin","user"]}';
const pretty = JSON.stringify(JSON.parse(ugly), null, 2);
console.log(pretty);
Python
Install: Standard library (json)
import json
ugly = '{"name":"Alice","age":30,"roles":["admin","user"]}'
pretty = json.dumps(json.loads(ugly), indent=2)
print(pretty)
Go
Install: Standard library (encoding/json)
package main
import (
  "encoding/json"
  "fmt"
)
func main() {
  ugly := []byte(`{"name":"Alice","age":30,"roles":["admin","user"]}`)
  var obj interface{}
  json.Unmarshal(ugly, &obj)
  pretty, _ := json.MarshalIndent(obj, "", "  ")
  fmt.Println(string(pretty))
}
Java
Install: com.fasterxml.jackson.core:jackson-databind
import com.fasterxml.jackson.databind.ObjectMapper;
public class Main {
  public static void main(String[] args) throws Exception {
    String ugly = "{"name":"Alice","age":30,"roles":["admin","user"]}";
    ObjectMapper mapper = new ObjectMapper();
    Object obj = mapper.readValue(ugly, Object.class);
    String pretty = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
    System.out.println(pretty);
  }
}
C#
Install: Newtonsoft.Json (Json.NET)
using System;
using Newtonsoft.Json;
class Program {
  static void Main() {
    var ugly = "{"name":"Alice","age":30,"roles":["admin","user"]}";
    var parsed = JsonConvert.DeserializeObject(ugly);
    var pretty = JsonConvert.SerializeObject(parsed, Formatting.Indented);
    Console.WriteLine(pretty);
  }
}
PHP
Install: Standard library (json_decode/json_encode)
<?php
$ugly = '{"name":"Alice","age":30,"roles":["admin","user"]}';
$obj = json_decode($ugly);
echo json_encode($obj, JSON_PRETTY_PRINT);
Ruby
Install: Standard library (json)
require 'json'
ugly = '{"name":"Alice","age":30,"roles":["admin","user"]}'
pretty = JSON.pretty_generate(JSON.parse(ugly))
puts pretty
Bash (Linux/macOS) with jq
Install: brew install jq (or apt-get install jq)
echo '{"name":"Alice","age":30,"roles":["admin","user"]}' | jq .
Rust
Install: cargo add serde_json
fn main() {
  let ugly = r#"{"name":"Alice","age":30,"roles":["admin","user"]}"#;
  let value: serde_json::Value = serde_json::from_str(ugly).unwrap();
  let pretty = serde_json::to_string_pretty(&value).unwrap();
  println!("{}", pretty);
}
Kotlin
Install: com.fasterxml.jackson.core:jackson-databind
import com.fasterxml.jackson.databind.ObjectMapper
fun main() {
  val ugly = "{"name":"Alice","age":30,"roles":["admin","user"]}"
  val mapper = ObjectMapper()
  val obj = mapper.readValue(ugly, Any::class.java)
  val pretty = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj)
  println(pretty)
}
Swift
Install: Standard library (JSONSerialization)
import Foundation
let ugly = "{\"name\":\"Alice\",\"age\":30,\"roles\":[\"admin\",\"user\"]}"
if let data = ugly.data(using: .utf8),
   let obj = try? JSONSerialization.jsonObject(with: data),
   let pretty = try? JSONSerialization.data(withJSONObject: obj, options: .prettyPrinted),
   let prettyString = String(data: pretty, encoding: .utf8) {
    print(prettyString)
}
TypeScript
Install: Standard library
const ugly = '{"name":"Alice","age":30,"roles":["admin","user"]}';
const pretty = JSON.stringify(JSON.parse(ugly), null, 2);
console.log(pretty);
SQL (PostgreSQL)
Install: Standard (jsonb_pretty)
SELECT jsonb_pretty('{"name":"Alice","age":30,"roles":["admin","user"]}'::jsonb);
MySQL
Install: Standard (JSON_PRETTY, 5.7+)
SELECT JSON_PRETTY('{"name":"Alice","age":30,"roles":["admin","user"]}');
PowerShell
Install: Standard
$ugly = '{"name":"Alice","age":30,"roles":["admin","user"]}'
$obj = $ugly | ConvertFrom-Json
$pretty = $obj | ConvertTo-Json -Depth 10
Write-Output $pretty
Perl
Install: cpan JSON
use JSON;
my $ugly = '{"name":"Alice","age":30,"roles":["admin","user"]}';
my $obj = decode_json($ugly);
print to_json($obj, { pretty => 1 });
Dart
Install: Standard library (dart:convert)
import 'dart:convert';
void main() {
  const ugly = '{"name":"Alice","age":30,"roles":["admin","user"]}';
  final obj = jsonDecode(ugly);
  final pretty = JsonEncoder.withIndent('  ').convert(obj);
  print(pretty);
}
Elixir
Install: mix deps.get jason
ugly = ~s({"name":"Alice","age":30,"roles":["admin","user"]})
{:ok, obj} = Jason.decode(ugly)
pretty = Jason.encode!(obj, pretty: true)
IO.puts(pretty)
Scala
Install: com.typesafe.play:play-json_2.13:2.9.4
import play.api.libs.json._
object Main extends App {
  val ugly = """{"name":"Alice","age":30,"roles":["admin","user"]}"""
  val jsValue = Json.parse(ugly)
  val pretty = Json.prettyPrint(jsValue)
  println(pretty)
}