JSONL / NDJSON Viewer, Validator & Converter
100% client-side. Your files never leave this browser tab. No upload, no server, no tracking. Works offline once the page is loaded.
Paste or drop a JSONL file
JSONL / NDJSON Viewer, Validator & Converter
Inspect, validate, and convert JSON Lines files in your browser. Built for AI fine-tune datasets, log exports, and streaming feeds.
Before you start
You need one of the following:
- A
.jsonlor.ndjsonfile (Newline Delimited JSON), or - Raw JSONL text where each line is a valid JSON object.
This tool is designed to help you eyeball data without the lag of a full-blown IDE. It samples the first few thousand lines to keep the browser responsive. If your file is a giant 500 MB log export, don't worry — I use a streaming parser so we don't crash your tab, but the interactive table view is best suited for sets under 50,000 records.
Note that nested objects are flattened for the table view. If you have a key like
"user": {"id": 1}, the column header will appear as user.id. This makes
sorting and filtering much easier than digging through nested trees.
How to use it
- Drop your
.jsonlfile into the zone above, or paste the text directly into the input pane. - Click Load to parse the records into the interactive table.
- Type a query into the Filter box to find specific records (e.g., finding all "error" levels).
- Switch the Mode between Substring (simple text match) or Expression (JS-like logic).
- Use the Prev/Next buttons to navigate through pages of data.
Options explained
Substring vs. Expression Filter
Substring is the "safe" mode. It looks at every cell in a row; if the text you typed exists anywhere in that row, it stays. It's case-insensitive and great for quick searches.
Expression mode is for power users. It lets you write logic like score > 10
or status == "active". It treats the column headers as variables. If your headers have
spaces or dots, wrap them in brackets or just stick to simple Substring matches.
The Pager
To keep the DOM from melting, I only render 50–100 rows at a time. The status bar tells you the total record count versus the filtered count. If you apply a filter, the pager resets to the first page of your results.
Example
Input (raw JSONL):
{"id": 1, "msg": "User login", "level": "info"}
{"id": 2, "msg": "Database timeout", "level": "error"}
{"id": 3, "msg": "User logout", "level": "info"}
Filtered View (Expression: level == "error"):
| id | msg | level |
|----|------------------|-------|
| 2 | Database timeout | error |
Tips & common pitfalls
- Empty lines are ignored. Some exporters leave a trailing newline at the end of the file; I strip those automatically so you don't get "Invalid JSON" errors on the last line.
- Mixed schemas can be messy. If the first 10 lines have 3 columns but line 1,000 has 10 columns, the table will grow to accommodate the new headers. It's best if your JSONL is "rectangular" (consistent keys).
- Large values are truncated. If a cell contains a massive text blob (like a base64 image or a long stack trace), the viewer clips it to keep the row height sane. You can usually see the full text by hovering or using the Formatter tool.
- Case sensitivity only applies to Expression mode. Substring mode is always case-insensitive for easier searching.
Troubleshooting
The table says "Invalid JSON" on line X.
JSONL requires every line to be a complete, valid JSON object. A missing curly brace or an unescaped newline inside a string will break the parser. Use the Validator tool to find and fix the specific line.
My filter isn't returning any results.
If you're in Expression mode, ensure you're using double equals (==) for comparisons and quotes for strings, e.g., category == "books". If in doubt, switch back to Substring mode.
The browser feels sluggish with a large file.
This usually happens if you have "Pretty-print" or "Full-render" active on a massive dataset. Try clearing the input and loading only the specific chunk of data you need to inspect.
Related tools
See also: if you need to do something adjacent on this site, try Formatter to pretty-print or minify each JSONL record, JSONL to CSV to flatten JSONL into a CSV with dotted keys, or JSONL to JSON to convert JSONL into a JSON array (or back).
Frequently asked questions
What exactly is JSONL / NDJSON?
It stands for JSON Lines (or Newline-Delimited JSON). Unlike a standard JSON file which is one giant array [...], JSONL is just one object per line. It's the standard for big data because you can append to it or read it line-by-line without loading the whole file into memory.
How large a file can I view here?
I've tested it with files up to 200 MB. Since the processing is done in chunks (streaming), it won't crash your browser, but your computer's RAM is the ultimate limit. For extremely large files, I recommend using CLI tools like jq.
Is my data being saved to your server?
Nope. I don't even have a backend for this. Everything happens in your browser's local memory via JavaScript. You can actually load this page, turn off your Wi-Fi, and it will still work perfectly. Check my privacy policy if you're worried.
Why is the table flattening my nested data?
Displaying deeply nested JSON in a 2D table is a nightmare. By flattening keys into parent.child notation, you can actually use the table to sort and filter by those nested values, which is usually what you want when inspecting datasets.
Can I export the filtered results?
Currently, the viewer is for "eyes-on" inspection. If you need to filter and save, it's usually better to use the JSONL to CSV tool, which handles the conversion and download in one go.