Structured data formats beyond JSON

JSON is the default interchange shape. Human-edited config, programmable constraints, LLM token budgets, and zero-copy wire formats pull in different successors. This page mirrors the Configuration classification and lineage graph in DevCentr’s Create… catalog.

Do not confuse prose with data

CentrMark / Markdown / AsciiDoc model document trees (paragraphs, headings, directives). SDLang / KDL / JSON model data trees (nodes, arguments, properties). Comparing KDL to CentrMark as peers is a category error—pick documentation markup or structured data first.

Human-edited config

Format Prefer when

SDLang (.sdl)

DevCentr owns the parser (catalogs, .devcentr.sdl, recognizer profiles, CentrMark properties). Comments, native types, low punctuation noise. See SDL Preference.

KDL (.kdl)

Greenfield or cross-language node documents: strict grammar, /- comments, (type) annotations. Use when the consumer is not DevCentr’s sdlang-d stack (DUB: kdl / kdl-d).

JSON5 (.json5)

Stuck in the JSON family but humans edit the file (comments, trailing commas). Use plain JSON when the tool forbids dialects.

Extended SDL / XDL

Avoid. Unfinished dialect in newsdlang; specs stubbed; KDL-compat plans dropped. Not a Dev-Centr path.

SDLang, KDL, and Extended SDL

Both SDLang and KDL are node-based documents. KDL is the clearer modern successor (unambiguous grammar, explicit type annotations, safer node commenting). Policy: keep SDLang where DevCentr already parses .sdl; prefer KDL for new documents outside that surface. Do not adopt Extended SDL/XDL as a compromise—it does not finish SDLang’s gaps and does not inherit KDL’s ecosystem. Full decision table: SDL Preference — Decision.

Three extremes beyond JSON text

When “better than JSON” is taken to the limit, solutions split by goal:

Goal Examples Mechanism

Validation and programmability

Pkl, CUE, Nickel, KCL

Schema, constraints, or generation live in the config language; often emit JSON/YAML for consumers.

Human or LLM ergonomics

KDL, TOON

Node trees or tabular/token-dense encodings instead of brace-heavy maps.

Network and CPU performance

Cap’n Proto, FlatBuffers, CBOR, MessagePack

Binary layouts; zero-copy or compact encodings. Humans do not hand-edit these as primary authoring.

Evolution (lineage)

flowchart TB
  json[JSON]
  json5[JSON5]
  sdlang[SDLang]
  kdl[KDL]
  xdl[XDL_avoid]
  toon[TOON]
  cbor[CBOR]
  msgpack[MessagePack]
  pkl[Pkl]
  cue[CUE]
  capnp[Capn_Proto]
  flatbuffers[FlatBuffers]
  json -->|evolves| json5
  json -->|evolves| sdlang
  sdlang -->|supersedes| kdl
  sdlang -.->|avoid| xdl
  json -->|specializes| toon
  json -->|specializes| cbor
  json -->|specializes| msgpack
  json -->|specializes| pkl
  json -->|specializes| cue
  json -->|specializes| capnp
  json -->|specializes| flatbuffers

Use the lineage view in Create… when the job tree (human config vs programmable vs binary) is not enough to separate near neighbors.