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 ( |
DevCentr owns the parser (catalogs, |
KDL ( |
Greenfield or cross-language node documents: strict grammar, |
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 |
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.
Related
-
Create… catalog and dialog: Content Create
-
Prose markup: Documentation markup
-
SDL policy: SDL Preference