Skip to content
Powrót do bloga
Poradniki

JSON5 i JSONC: bardziej wyrozumiały sposób formatowania JSON

Poznaj różnice między JSON5 a JSONC, formatuj pliki konfiguracyjne z komentarzami i wpinaj formatery do pipeline'u CI — z praktycznymi przykładami kodu.

7 min czytania

JSON5 i JSONC: bardziej wyrozumiały sposób formatowania JSON

Kiedy ścisły JSON każe debugować do późnej nocy z powodu jednego brakującego przecinka, najwyższy czas poznać jego bardziej wyrozumiałych krewnych — JSON5 oraz JSON with Comments (JSONC).

Czym jest JSON5?

JSON5 to rozszerzenie JSON, które przejmuje funkcje z ECMAScript 5.1, w tym klucze bez cudzysłowów, przecinki kończące, łańcuchy w pojedynczych cudzysłowach, komentarze oraz liczby szesnastkowe. Format jest rozwijany przez społeczność i został zaprojektowany tak, aby ręcznie pisane pliki konfiguracyjne były czytelniejsze i bardziej wyrozumiałe niż w przypadku ścisłego JSON.

Czym jest JSONC?

JSONC (JSON with Comments) to minimalne rozszerzenie standardowego JSON, które dodaje obsługę komentarzy jednoliniowych (//) i wieloliniowych (/* */) oraz przecinków kończących. Jest utrzymywany przez Microsoft i pełni funkcję natywnego formatu dla ustawień VS Code, plików tsconfig.json oraz innych plików konfiguracyjnych TypeScript.

Po co nam „wyrozumiały” JSON

  • Bariery czytelności: Standardowy JSON zabrania komentarzy, przecinków kończących, pojedynczych cudzysłowów itd., co utrudnia zrozumienie konfiguracji i przykładów.
  • Trudność współpracy w zespole: Ogromne pliki JSON bez żadnych adnotacji są trudne w utrzymaniu; drobna edycja może uszkodzić cały plik.
  • Realia DevOps: Kubernetes oraz pipeline’y CI/CD często łączą lub generują JSON w locie; wyrozumiała składnia mocno ogranicza ręczne poprawki.

JSON5 a JSONC — szybkie porównanie

CechaJSON (ścisły)JSON5JSONC
// komentarze jednolinioweNieTakTak
/* */ komentarze wielolinioweNieTakTak
Przecinki kończąceNieTakTak
Łańcuchy w pojedynczych cudzysłowachNieTakNie
Klucze bez cudzysłowówNieTakNie
Znaki liczbowe + / -NieTakNie
Liczby szesnastkowe i binarneNieTakNie
Opiekunowie specyfikacjiECMASpołeczność (A. Rauschmayer)Microsoft / VS Code

W jednym zdaniu: JSON5 sprawia wrażenie literału obiektu JavaScript, podczas gdy JSONC to po prostu standardowy JSON z komentarzami.

Przykłady składni

Klasyczny JSON (ścisły)

{
  "name": "Go Tools",
  "features": ["Base64", "JSON Formatter"]
}

Przykład JSON5

// Project config
{
  name: 'Go Tools',      // single quotes & unquoted keys
  features: [
    'Base64',
    'JSON Formatter',    // trailing comma
  ],
  version: 1.0,          // non-string number allowed
}

Przykład JSONC

{
  // Project name
  "name": "Go Tools",
  // Feature list
  "features": [
    "Base64",
    "JSON Formatter", // trailing comma
  ]
}

Wsparcie dla formatowania i parsowania

ScenariuszJSON5JSONCPolecane biblioteki / narzędzia
PrzeglądarkaPolyfill JSON5.parse(), Prettier z wbudowanym parser json5 (>= v1.13)Natywne wsparcie settings.json w VS Code
Node.jsPakiet npm json5comment-json, jsonc-parserObsługują formatowanie z CLI i parsowanie AST
IDERozszerzenia do VS Code i WebStormNatywne w VS Code, wtyczka do WebStormPrettier ujednolica formatowanie
CI / Linteslint-plugin-json5eslint-plugin-jsoncIntegracja z Husky i lint-staged
Narzędzie onlineGo Tools JSON Formatter (upiększa i waliduje JSON5/JSONC)To samoFormatowanie JSON

Szybkie formatowanie w VS Code

Dodaj do settings.json:

"[jsonc]": {
  "editor.defaultFormatter": "esbenp.prettier-vscode"
}

Następnie wystarczy nacisnąć Alt + Shift + F, aby upiększyć dowolny plik JSONC.

Pliki konfiguracyjne w realnym świecie

JSON5 oraz JSONC są już szeroko używane w plikach konfiguracyjnych spotykanych na co dzień. Oto konkretne przykłady:

TypeScript (tsconfig.json — JSONC)

{
  // Strict mode catches more bugs at compile time
  "compilerOptions": {
    "strict": true,
    "target": "ES2022",
    "module": "ESNext",
    "outDir": "./dist",
    // Path aliases for cleaner imports
    "paths": {
      "@/*": ["./src/*"],
      "@tests/*": ["./tests/*"],
    },
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"],
}

Plik tsconfig.json w TypeScript natywnie korzysta z JSONC — komentarze i przecinki kończące działają od razu. To jeden z najczęściej spotykanych plików JSONC w każdym projekcie JavaScript/TypeScript.

ESLint flat config (eslint.config.json — JSONC)

{
  "rules": {
    // Warn on console.log, but allow console.error
    "no-console": ["warn", { "allow": ["error", "warn"] }],
    "semi": ["error", "always"],
    "quotes": ["error", "double"],
  }
}

Babel (babel.config.json5 — JSON5)

{
  // Single quotes and unquoted keys make it more readable
  presets: [
    ['@babel/preset-env', {
      targets: '> 0.25%, not dead',
      modules: false,  // Let bundler handle modules
    }],
  ],
  plugins: [
    '@babel/plugin-transform-runtime',
  ],
}

Ustawienia obszaru roboczego VS Code (.vscode/settings.json — JSONC)

{
  // Editor preferences
  "editor.fontSize": 14,
  "editor.tabSize": 2,
  "editor.formatOnSave": true,

  // Language-specific overrides
  "[typescript]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
  },
  "[jsonc]": {
    "editor.defaultFormatter": "esbenp.prettier-vscode",
  },
}

Praktyczne wskazówki i pułapki

1. Konwersja przed wdrożeniem na produkcję

Przeglądarki nadal wymagają ścisłego JSON dla JSON.parse. Warto użyć narzędzi z etapu builda, aby usunąć komentarze i przecinki kończące:

// Node.js build script: convert JSON5 config to strict JSON
import JSON5 from 'json5';
import { readFileSync, writeFileSync } from 'fs';

const config = JSON5.parse(readFileSync('config.json5', 'utf8'));
writeFileSync('config.json', JSON.stringify(config, null, 2));

W przypadku bundlerów można sięgnąć po rollup-plugin-json5 lub vite-plugin-json5, które obsłużą konwersję automatycznie podczas builda.

2. Bezpieczeństwo i niezawodność

Pobłażliwość może maskować nadmiarowe pola. Konfigurację należy zawsze walidować z użyciem JSON Schema lub zod, zanim zostanie ona zużyta:

// Validate config shape with zod after parsing
import { z } from 'zod';
import JSON5 from 'json5';

const ConfigSchema = z.object({
  port: z.number().min(1).max(65535),
  host: z.string(),
  debug: z.boolean().default(false),
});

const raw = JSON5.parse(readFileSync('config.json5', 'utf8'));
const config = ConfigSchema.parse(raw); // Throws if invalid

3. Konwencje zespołowe

  • Warto zaznaczyć w README, że pliki *.json5 służą wyłącznie do konfiguracji; pakiety wydawane do publikacji powinny zawierać ścisłe .json.
  • Należy ustandaryzować reguły Prettier, aby ograniczyć szum w diffach.
  • Plik .editorconfig pomaga wymusić spójne wcięcia w plikach JSON, JSON5 oraz JSONC.

4. Wydajność

Parsowanie JSON5/JSONC dokłada zależności i lekki narzut — to do przyjęcia w narzędziach CLI i deweloperskich, ale na produkcji warto to zmierzyć. Pakiet npm json5 waży około 8 KB po minifikacji, a parsowanie jest mniej więcej 2–5 razy wolniejsze niż natywny JSON.parse. Dla plików konfiguracyjnych ładowanych raz przy starcie różnica jest pomijalna. Dla gorących ścieżek przetwarzających tysiące obiektów na sekundę lepiej pozostać przy ścisłym JSON.

Najczęściej zadawane pytania

Jaka jest różnica między JSON5 a JSONC?

JSON5 rozszerza JSON o składnię w stylu JavaScriptu: klucze bez cudzysłowów, przecinki kończące, komentarze jednoliniowe i blokowe, liczby szesnastkowe oraz wieloliniowe łańcuchy. JSONC jest prostszy — dodaje wyłącznie komentarze jednoliniowe (//) i blokowe (/* */) do standardowego JSON. JSONC wybierze się do plików konfiguracyjnych, gdzie wystarczą komentarze; JSON5 sprawdzi się tam, gdzie potrzeba bogatszej składni.

Czy można używać JSON5 lub JSONC w produkcyjnych API?

Nie — JSON5 i JSONC są przeznaczone do plików konfiguracyjnych, a nie do wymiany danych. API powinny korzystać ze standardowego JSON (RFC 8259), aby zapewnić maksymalną interoperacyjność. JSON5/JSONC warto zarezerwować dla lokalnych plików konfiguracyjnych takich jak tsconfig.json, .vscode/settings.json lub konfiguracji środowiska, gdzie czytelność dla człowieka liczy się bardziej niż przetwarzanie maszynowe.

Czy VS Code natywnie obsługuje JSON5?

VS Code obsługuje JSONC natywnie (jego własne pliki ustawień korzystają z JSONC), ale nie wspiera JSON5 od razu po instalacji. Dla JSON5 należy zainstalować dedykowane rozszerzenie, na przykład „JSON5 syntax” z marketplace VS Code. Można też w ustawieniach skojarzyć pliki .json5 z trybem językowym JSON5.

Jak skonwertować JSON5 do standardowego JSON?

Wystarczy użyć pakietu npm json5: JSON5.parse() wczytuje JSON5, a następnie JSON.stringify() zwraca standardowy JSON. W wersji CLI można uruchomić npx json5 < input.json5 > output.json. Narzędzia online, takie jak nasz JSON Formatter, potrafią również zwalidować skonwertowany wynik, aby potwierdzić jego poprawność.

Czy JSONC to to samo co JSON with Comments?

Tak — JSONC to skrót od „JSON with Comments” i jest formatem używanym przez VS Code, TypeScript (tsconfig.json) oraz inne narzędzia Microsoftu. Format trzyma się standardowej specyfikacji JSON, dodając jedynie komentarze // i /* */. Parser usuwa komentarze przed właściwym przetwarzaniem, dzięki czemu otrzymana struktura danych jest identyczna jak w standardowym JSON.

Aby poznać więcej narzędzi deweloperskich działających w przeglądarce — w tym kodowanie Base64, generowanie sum kontrolnych i konwersję timestampów — warto zajrzeć do naszego przewodnika po niezbędnych narzędziach dla programistów.

Podsumowanie

Zachowanie równowagi między czytelnością a rygorem to klasyczne wyzwanie deweloperskie. JSON5 oraz JSONC poprawiają komfort pisania, a w połączeniu z odpowiednim pipeline’em buildowania i walidacji można bezpiecznie cieszyć się zaletami „pobłażliwego JSON”.

Źródła

Powiązane artykuły

Zobacz wszystkie artykuły