Back to blog
Blog

How to convert CSV to JSON, methods and considerations

CSV to JSON conversion looks trivial until you hit nested data, type coercion, or large files. Here are the four methods that actually work in production, and when to use which.

Stéphane JauffretCo-founder

CSV and JSON solve different problems. CSV stores flat tabular data for humans and spreadsheets. JSON stores structured, hierarchical data for applications and APIs. The conversion between the two is a constant need in modern workflows, integrating with a REST API, seeding a NoSQL database, exposing a dataset to a web frontend.

For simple files, the conversion is trivial. For real data coming from real systems, it is rarely as clean as the demo examples suggest. This guide covers four ways to convert CSV to JSON, when each one fits, and the problems to expect along the way.

Before you convert, prepare your CSV

Most conversion failures come from the CSV itself, not the conversion tool. A few minutes of preparation saves hours of debugging.

Check that column headers are clean. Each column should have a unique, descriptive name. No special characters, no duplicates, no spaces. If your CSV has "First Name", rename it to "first_name" in the header row before conversion. The names will become JSON keys, and keys with spaces or special characters are painful to work with in code.

Check for malformed rows. Trailing commas, empty lines, rows with a different number of fields than the header, these all break conversion. A quick scan in VS Code or a validator like csvlint catches most issues.

Check the encoding. UTF-8 is the standard for JSON. If your CSV is in a different encoding (Windows-1252, ISO-8859-1), convert it to UTF-8 first, otherwise accented and special characters become mojibake in the output.

Flatten embedded structures. CSV is flat by design, but people sometimes stuff multiple values into a single cell like ["item1", "item2"] or tag1;tag2;tag3. Decide how to handle these before converting, either split into separate columns or parse them during conversion into proper JSON arrays.

Method 1: Python with pandas

For developers and data teams, pandas is the right default. It handles encoding, malformed rows, and large files better than almost any alternative, and the API is terse.

import pandas as pd
df = pd.read_csv('input.csv')
df.to_json('output.json', orient='records', indent=2)

The orient='records' argument produces an array of objects, which is what most APIs and applications expect:

[
  {"name": "Jane Doe", "email": "jane@example.com", "age": 30},
  {"name": "John Smith", "email": "john@example.com", "age": 45}
]

Other orient values exist for specific needs. orient='index' keys by row index, useful for dataframes with meaningful indexes. orient='split' preserves column and index metadata separately. For most API scenarios, records is the right answer.

One trap to watch for. pandas infers types from the data, which is usually what you want but occasionally wrong. Phone numbers with leading zeros get read as integers, dropping the zeros. Account IDs that look like floats get converted. For files where exact type preservation matters, pass dtype=str to read_csv and handle type conversion explicitly.

Method 2: Native JavaScript or Node.js

For web projects where the conversion happens in the browser or in a Node backend, native JavaScript is often enough, without pulling in a dependency.

const csv = fs.readFileSync('input.csv', 'utf-8');
const [header, ...rows] = csv.trim().split('\n');
const keys = header.split(',');
const json = rows.map(row => {
  const values = row.split(',');
  return Object.fromEntries(keys.map((k, i) => [k, values[i]]));
});
fs.writeFileSync('output.json', JSON.stringify(json, null, 2));

This works for clean files. It breaks on any CSV that uses quoted values, escaped commas, or multiline cells. For anything beyond trivial inputs, use a library like papaparse or csv-parse that handles the CSV spec properly.

import Papa from 'papaparse';
const result = Papa.parse(csv, {
  header: true,
  dynamicTyping: true,
  skipEmptyLines: true
});
const json = JSON.stringify(result.data, null, 2);

dynamicTyping: true converts numbers and booleans automatically, which is usually helpful but sometimes not. Same trap as pandas, leading zeros disappear.

Method 3: Online converters

For one-off conversions without writing code, online tools work fine. csvjson.com, convertcsv.com, and json-csv.com are the common choices.

These are appropriate for non-sensitive data, small files, and one-off tasks. Do not use them for anything containing personal data, financial records, or business-critical information. The file is uploaded to a third-party server, and there is no standard guarantee about how long it is stored or who can access it.

For anything sensitive, use a local method (pandas, Node) or a tool you control.

Method 4: Excel via Power Query

Excel can handle CSV to JSON through Power Query, though the path is indirect. Load the CSV with Get Data, transform as needed, then export. The main value here is when the conversion needs to happen as part of a broader Excel-based workflow.

For pure CSV to JSON conversion, this is the most cumbersome method. It is worth using only when the team already works in Excel and does not want to introduce Python or another tool.

The harder cases, nested structures

The examples above assume a flat one-to-one mapping between CSV rows and JSON objects. Real-world conversions often need to produce nested JSON from flat CSV data.

Imagine a CSV with columns order_id, item_name, quantity, price, where each order has multiple line items. The JSON you want looks like this:

[
  {
    "order_id": "A001",
    "items": [
      {"item_name": "Widget", "quantity": 2, "price": 10},
      {"item_name": "Gadget", "quantity": 1, "price": 25}
    ]
  }
]

Producing this requires grouping rows by order_id and nesting the items. pandas handles it with groupby and a bit of reshaping, but the logic is case-specific. Online converters do not handle this. For one-off jobs, a short script is usually faster than trying to force a generic tool.

When this pattern recurs across many sources with different field naming conventions, the conversion becomes a data mapping problem, not a format problem.

Why Convert CSV to JSON in the first place

JSON wins whenever the consumer is an application rather than a spreadsheet. Four common reasons.

API integration. Most REST APIs accept and return JSON. If you need to feed a CSV into an API, the conversion is your bridge.

Web and mobile frontends. JavaScript frameworks like React and Vue work natively with JSON. Handing a frontend a CSV forces it to parse the file, whereas JSON is consumable immediately.

NoSQL databases. MongoDB, CouchDB, DynamoDB, and similar systems store JSON-like documents. Importing from CSV usually goes through a JSON intermediate.

Configuration and automation. Tools like Ansible, Terraform, and countless CI pipelines consume JSON or YAML, never CSV.

When conversion is not the real problem

If you are repeatedly converting the same CSV shape from the same source for the same downstream use, the conversion is not the problem. The problem is that a manual file transfer is in your workflow.

The right answer in those cases is not a faster conversion script. It is to move the data through an API or a dedicated import layer that handles the format translation automatically. We wrote about this shift in detail, for anyone whose team is spending noticeable time on recurring conversions.

For genuine one-off conversions, the methods above are your toolkit.

Conclusion

CSV to JSON is a five-minute job when the CSV is clean and the JSON structure is flat. It becomes a real engineering task when the data has nested structures, the source CSV is messy, or the conversion needs to run reliably at scale. The methods in this guide cover the common cases. For anything beyond, the problem is usually not the conversion itself, but what the data is going through after it.

Get started

See it in action

Try the interactive demo, or book a call to walk through your specific import workflow with our team.