Go to Sign up
Note: Your files never leave your device. We don't upload, transfer, or store your data.
JSONLines (also called JSONL, NDJSON, or Newline-Delimited JSON) is a text format where each line contains a single valid JSON value. There is no wrapping array or outer structure.
{"name": "Alice", "age": 30}
{"name": "Bob", "age": 25}
{"name": "Charlie", "age": 35}
The format is defined at jsonlines.org and is sometimes referred to as:
| Name | Abbreviation | Context |
|---|---|---|
| JSON Lines | JSONL | General |
| Newline-Delimited JSON | NDJSON | Streaming / logs |
| Line-Delimited JSON | LDJSON | Data pipelines |
| Feature | JSON | JSONLines |
|---|---|---|
| Structure | Single complete document (array or object) | One JSON value per line |
| Wrapper | [...] array brackets required | No wrapper |
| Separator | Commas between elements | Newlines between entries |
| Trailing comma | Not allowed | No commas at all |
| Parsing | Must read entire document first | Line-by-line (streaming) |
| Append | Must modify array structure | Append a new line |
| File size | Slightly larger (brackets, commas) | Slightly smaller |
| Error isolation | One error breaks entire document | Only the affected line is invalid |
| Encoding | UTF-8 | UTF-8 |
| MIME type | application/json | application/jsonl or application/x-ndjson |
| File extension | .json | .jsonl or .ndjson |
| Use Case | Description |
|---|---|
| BigQuery import | Google BigQuery loads JSONL files natively via bq load |
| Elasticsearch bulk API | Bulk indexing requires NDJSON format (action line + data line pairs) |
| Snowflake loading | COPY INTO supports JSONL natively |
| Log files | Append-only log entries — each line is independent |
| Streaming | Process data line-by-line without loading entire file into memory |
| Hugging Face datasets | ML datasets commonly distributed as .jsonl files |
| Apache Spark | Spark reads JSONL natively with spark.read.json() |
| Data pipelines | Kafka, Fluentd, Logstash use NDJSON for event transport |
| Append-friendly storage | Append new records without rewriting the entire file |
| Error resilience | Corrupted lines don't prevent processing of other lines |
| Platform | How JSONL Is Used |
|---|---|
| Google BigQuery | bq load --source_format=NEWLINE_DELIMITED_JSON |
| Elasticsearch | _bulk API requires NDJSON |
| Snowflake | COPY INTO with FILE_FORMAT = (TYPE = JSON) |
| Amazon Redshift | COPY with JSON 'auto' from JSONL files |
| Apache Spark | spark.read.json("data.jsonl") |
| Hugging Face | Datasets in .jsonl format |
| OpenAI Fine-tuning | Training data submitted as .jsonl |
| Logstash | NDJSON input plugin |
| MongoDB | mongoimport with --type json reads JSONL |
| PostgreSQL | \copy or COPY with JSONL via extensions |
| AWS Kinesis Firehose | NDJSON delivery to S3 |
| Datadog Logs | Log entries in JSONL format |
File Upload: Drag and drop or select a .json file.
Code Editor: Paste or type raw JSON with syntax highlighting and real-time validation.
Description: Intelligently parse JSON strings embedded in cells into structured objects.
When enabled, the tool detects string values that contain valid JSON and parses them into proper JSON objects before converting to JSONL.
Example — Parse JSON disabled:
{"id": 1, "data": "{\"x\": 10, \"y\": 20}"}Example — Parse JSON enabled:
{"id": 1, "data": {"x": 10, "y": 20}}Use this when your source JSON contains escaped JSON strings (common in database exports, API responses that serialize nested objects as strings, or log aggregation pipelines).
Choose the format of each JSONLine entry. Controls how the output is structured per line.
All processing runs entirely in your browser. No data is uploaded to any server.
Choose one of two input methods:
Upload a file: Click "Choose File" and select a .json file, or drag it into the upload area.
Paste data: Click "Enter Data" to switch to the code editor. Paste your JSON array. A "Valid JSON" badge confirms correct formatting.
Important: The tool expects a JSON array. Each array element becomes one line in the output.
Use the Properties panel on the right:
Parse JSON: Enable to parse embedded JSON strings into objects.
Data Format: Choose the output format for each line.
Click Convert. The JSONLines output appears in the "Output Data" panel.
Click Copy to Clipboard to paste into a .jsonl file.
Premium users can click Download File to save.
Input JSON:
[
{"name": "Alice", "age": 30, "city": "New York"},
{"name": "Bob", "age": 25, "city": "London"},
{"name": "Charlie", "age": 35, "city": "Tokyo"}
]
Configuration:
Parse JSON: Off
Data Format: (default)
Output:
{"name": "Alice", "age": 30, "city": "New York"}
{"name": "Bob", "age": 25, "city": "London"}
{"name": "Charlie", "age": 35, "city": "Tokyo"}
Input JSON:
[
{"id": 1, "payload": "{\"temperature\": 23.5, \"unit\": \"celsius\"}"},
{"id": 2, "payload": "{\"temperature\": 19.8, \"unit\": \"celsius\"}"}
]
Configuration:
Parse JSON: On
Output:
{"id": 1, "payload": {"temperature": 23.5, "unit": "celsius"}}
{"id": 2, "payload": {"temperature": 19.8, "unit": "celsius"}}
Input JSON:
[
{"order_id": "ORD-001", "total": 149.99, "items": 3, "status": "shipped"},
{"order_id": "ORD-002", "total": 59.50, "items": 1, "status": "pending"},
{"order_id": "ORD-003", "total": 224.00, "items": 5, "status": "shipped"}
]
Output (saved as orders.jsonl):
{"order_id": "ORD-001", "total": 149.99, "items": 3, "status": "shipped"}
{"order_id": "ORD-002", "total": 59.50, "items": 1, "status": "pending"}
{"order_id": "ORD-003", "total": 224.00, "items": 5, "status": "shipped"}
BigQuery load command:
bq load --source_format=NEWLINE_DELIMITED_JSON \my_dataset.orders \gs://my-bucket/orders.jsonlOutput (with action metadata lines):
{"index": {"_index": "users", "_id": "1"}}
{"name": "Alice", "age": 30, "city": "New York"}
{"index": {"_index": "users", "_id": "2"}}
{"name": "Bob", "age": 25, "city": "London"}
Elasticsearch _bulk API requires alternating action and data lines in NDJSON format.
{
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What is 2+2?"},
{"role": "assistant", "content": "4"}
]
}
{
"messages": [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Capital of France?"},
{"role": "assistant", "content": "Paris"}
]
}
OpenAI fine-tuning data must be submitted as a .jsonl file.
From jsonlines.org:
UTF-8 encoding — each file must be valid UTF-8
One JSON value per line — each line is a complete, valid JSON value
Line separator — \n (0x0A) — \r\n is also accepted
No trailing comma — each line ends at } or ]
No blank lines — every line must contain a JSON value (except the final newline)
No. All conversion happens locally in your browser using JavaScript. Your data never leaves your device.
JSONLines (JSONL / NDJSON) is a format where each line of a file contains a separate, valid JSON object. There is no wrapping array. It is used for streaming, log files, and bulk data imports.
JSON wraps multiple records in a [...] array with comma separators. JSONLines puts each record on its own line with no commas or brackets. JSONLines supports line-by-line processing, appending, and error isolation.
It detects string values in your JSON data that contain embedded JSON (e.g., "{\"x\": 1}") and parses them into proper JSON objects (e.g., {"x": 1}). Enable this when your source data has escaped JSON strings inside string fields.
BigQuery, Elasticsearch, Snowflake, Redshift, Apache Spark, MongoDB, Hugging Face, OpenAI (fine-tuning), Logstash, and many more.
Use .jsonl or .ndjson. Both are widely recognized. BigQuery documentation uses .jsonl. Elasticsearch documentation uses .ndjson.
The tool processes data entirely in your browser. Files up to 10 MB typically convert without issues on modern hardware.
Yes. The tool is responsive and works on smartphones and tablets.