CSV, JSON, and YAML: When to Use Which Format
Three formats dominate data interchange: CSV for tabular data, JSON for APIs and web applications, and YAML for configuration files. Here's a practical guide to choosing between them — and converting when you need to switch.
CSV — Comma-Separated Values
CSV is the oldest and simplest of the three formats. It encodes a two-dimensional table as plain text: one row per line, values separated by commas. The first row is typically a header row with column names.
Use CSV when:
- Your data is tabular — rows and columns with uniform structure
- You need to open it in a spreadsheet application (Excel, Google Sheets, LibreOffice)
- You are importing or exporting from a database, CRM, or analytics platform
- File size is a constraint — CSV has the lowest overhead of the three formats
- Non-technical stakeholders will read or edit the file directly
Do not use CSV when:
- Your data is nested or hierarchical (e.g., an order with multiple line items, each with their own properties)
- Values might themselves contain commas or newlines (though proper quoting handles this, it is fragile in practice)
- You need to represent different data types — CSV has no native concept of numbers vs. strings vs. booleans; everything is text
JSON — JavaScript Object Notation
JSON was designed as a lightweight data format for web APIs and has become the universal language of networked applications. It supports strings, numbers, booleans, null, arrays, and nested objects — covering the full range of structured data types.
Use JSON when:
- You are building or consuming a REST or GraphQL API
- Your data has nested or hierarchical structure
- The data will be parsed and consumed by code, not read by humans
- You need native type support (e.g., distinguishing
truefrom"true", or42from"42") - You are working in JavaScript, Python, Go, or virtually any other modern language — all have built-in JSON parsers
Do not use JSON when:
- The file will be read and edited frequently by humans — JSON has no comment support and is verbose to write by hand
- Your data is purely tabular and will live in a spreadsheet — CSV is simpler and opens natively everywhere
YAML — YAML Ain't Markup Language
YAML is a superset of JSON designed for human readability. It uses indentation instead of braces and brackets, supports comments, and allows multi-line strings without escaping. It can express everything JSON can, plus more.
Use YAML when:
- You are writing configuration files that developers will read and edit regularly (Docker Compose, Kubernetes manifests, GitHub Actions, Ansible playbooks)
- You want to include comments explaining non-obvious settings
- You need multi-line strings or complex scalar values that would be awkward in JSON
- You are working in a DevOps, infrastructure, or CI/CD context where YAML is the de facto standard
Do not use YAML when:
- The file will be generated by code or parsed in a performance-sensitive path — JSON parsers are faster and more widely supported
- Indentation errors are a concern — YAML's whitespace-sensitivity means a misplaced space can silently break a file in hard-to-debug ways
- You are building a public API — JSON is the expected format and YAML is not supported by browsers natively
Quick comparison
- Human-readable: YAML > JSON > CSV
- Machine-parseable: JSON ≥ CSV > YAML
- Supports nesting: JSON and YAML (yes), CSV (no)
- Supports comments: YAML (yes), JSON (no), CSV (no)
- File size for tabular data: CSV < JSON < YAML
- Browser support: JSON (native), CSV and YAML (need a library)
Converting between formats
The conversion direction matters:
- CSV → JSON: Each row becomes an object; column headers become keys. Straightforward if the CSV is well-formed.
- JSON → CSV: Only works cleanly if the JSON is an array of flat objects. Nested structures must be flattened first — this is a lossy conversion.
- JSON ↔ YAML: These are structurally equivalent. Any JSON document is valid YAML. Converting either direction is lossless (YAML comments are lost when converting YAML → JSON, but data is preserved).