Query and patch JSON/JSONL files from the command line
Project description
jsonseek
JSON/JSONL parsing toolkit, designed for LLMs.
When LLMs touch JSON, they should
shapefirst,querysecond, nevercatthe whole file. When a human touches JSON, the same rules apply — just with a keyboard instead of a context window.
jsonseek is an LLM-friendly parser and partial editor for large JSON / JSONL files. The core principle: never let an LLM cat an entire JSON file into context. Run shape for the skeleton, query / get for precise lookup, then set / add / del / append for the smallest possible edit.
Supports structural understanding, field summaries, partial queries, partial edits, bug localization and repair — for both JSON and JSONL with one command set.
🤖 Skills for LLM Coding Agents (Claude / Kimi / Cursor / Codex, etc.)
Tell your agent "use jsonseek" and it just works. Skills live below — read on demand.
| Skill | Link | Use |
|---|---|---|
| SKILL.md | 👉 View on GitHub | Agent startup: triggers, command cheatsheet, the three iron rules for writes, Windows API fallback |
| commands.md | 👉 View on GitHub | On demand: every flag / example / output format |
| path-syntax.md | 👉 View on GitHub | On demand: full path syntax (dot / bracket / mixed / array / escape) |
Skills on GitHub: lo2589/jsonseek/skills/jsonseek/
Plug into an agent (Claude Code / Cursor / Codex / etc.):
git clone https://github.com/lo2589/jsonseek.git
ln -s ../jsonseek/skills/jsonseek/SKILL.md ~/.claude/skills/jsonseek.md
# or ~/.cursor/skills/ ~/.codex/skills/
Why JSON Deserves a Dedicated Tool
JSON is the de facto standard for modern data exchange. From ML experiment logs, API configs, application log streams, to microservice registries and crawler dumps — JSON / JSONL is everywhere:
- ML experiment tracking: training parameters, metric curves, and model configs all live as JSON. A single experiment directory can easily reach tens of MB.
- API / microservice configs: service discovery, routing rules, environment variables — often managed as JSON configs.
- Logs & event streams: structured logs (JSONL) are easier to query than plain text, but file size grows fast.
- Data exchange: frontend-backend communication, inter-service RPC, crawler dumps — JSON is the most common format.
The problem: the bigger the JSON, the more expensive it is to process. cat-ing a 10MB JSON into LLM context burns millions of tokens. Even human developers suffer scanning thousands of nested lines.
jsonseek solves this — replace full reads with partial operations, replace manual scanning with structured queries. For LLM coding agents and developers handling JSON / JSONL frequently, this is essential tooling.
Why LLMs Should Use jsonseek
When you (or your running Claude / Kimi / Cursor / Codex agent) face a 10MB JSON, full cat into context is catastrophic token waste. jsonseek lets the agent:
- Understand structure first —
shapefor the skeleton,fieldsfor the field list, without reading content - Locate targets next —
queryto search keywords,lsto browse a layer,getfor a precise value - Edit partially last —
set/add/del/appendonly where needed
Token savings estimate
| File size | Operation | Full read | jsonseek output |
Savings |
|---|---|---|---|---|
| 100KB config JSON | shape |
~25K tokens | ~100 tokens | 99%+ |
| 100KB config JSON | fields |
~25K tokens | ~300 tokens | 98%+ |
| 100KB config JSON | get single value |
~25K tokens | ~10 tokens | 99%+ |
| 100KB config JSON | query hit a few |
~25K tokens | ~100 tokens | 99%+ |
| 10MB log JSONL | shape sampled |
~2.5M tokens | ~200 tokens | 99.9%+ |
| 10MB log JSONL | query hit dozens |
~2.5M tokens | ~1K tokens | 99.9%+ |
Rough estimate: 1 token ≈ 4 bytes of English. Actual ratios vary by content and tokenizer, but the order of magnitude is stable — the bigger the file, the bigger the savings.
Typical agent workflow
# 1. Read the skeleton — no content needed
jsonseek shape data.jsonl
# 2. See the field list
jsonseek fields data.jsonl --top
# 3. Search a keyword
jsonseek query data.jsonl password --record-id-field id --max-results 5
# 4. Read a specific value
jsonseek get data.jsonl '[3].password'
# 5. Modify (**always start with --dry-run**)
jsonseek set data.jsonl '[3].password' 'newpass' --dry-run
jsonseek set data.jsonl '[3].password' 'newpass' --backup
📦 Installation
pip install jsonseek
Requires Python 3.8+. Zero dependencies, zero configuration — install and run.
$ jsonseek --version
jsonseek 0.1.2
Command reference
Read / inspect (safe, read-only)
| Command | Purpose |
|---|---|
shape FILE |
Display structure / skeleton tree |
fields FILE [keyword] |
List all fields and types |
ls FILE [path] |
List children at a path |
get FILE path |
Get a value at a path |
query FILE keyword |
Search keys or values |
extract PATTERN path |
Batch-extract the same path from many JSON files |
concat PATTERN |
Merge multiple JSON files into JSONL |
Write / partial edits (modifies files)
| Command | Purpose |
|---|---|
set FILE path value |
Modify a field |
add FILE path value |
Add a new key |
del FILE path |
Delete a key or array element |
append FILE path value |
Append one item to an array |
extend FILE path json_array |
Extend an array from a JSON array |
cutline FILE N |
Extract a specific JSONL line to a temp file |
replaceline FILE N |
Replace a specific JSONL line |
Common flags
| Flag | Purpose |
|---|---|
--output json |
Machine-readable output (required when piping to another tool / agent) |
--backup |
Create a .bak backup before any write |
--dry-run |
Always use this before any write to preview |
--kind {json,jsonl} |
Force file type (auto-detected by default) |
--encoding ENCODING |
Force encoding (auto-detected by default; e.g. gbk) |
--context N |
Lines of context around the target (JSONL only, default 2) |
Path syntax
| Style | Example | Meaning |
|---|---|---|
| Dot | a.b.c |
a -> b -> c |
| Bracket | a[key1][key2] |
a -> key1 -> key2 |
| Mixed | a[key1].b[0] |
a -> key1 -> b -> 0 |
| Array index | items[0][1] |
items -> 0 -> 1 |
The three iron rules (for LLMs and humans)
- Before any write, always
--dry-runfirst:jsonseek set file.json path value --dry-run # [DRY-RUN] Before: path = old # [DRY-RUN] After: path = new
- Before any write, always add
--backup:jsonseek set file.json path value --backup # → creates file.json.bak
- When piping to another tool, always add
--output json:jsonseek query file.json keyword --output json | jq '.hits[0]'
Designed for AI / Coding Agents
jsonseek's design philosophy is the LLM's token budget:
- Output as short as possible: by default only the filtered essentials, never the whole structure
- Stable output format: every command supports
--output json, agents parse directly - Writes are previewable: every
set/add/delhas--dry-run, agents preview the diff before invoking - Streaming:
jsonseek shapeon a 10MB JSONL only reads the first 100 lines (--sample-sizeadjustable), token usage is bounded
Typical agent workflow:
read → shape / fields / ls / query / get
↓ (understand structure)
locate → query / get
↓ (find target)
write → set / add / del / append (--dry-run first → --backup for real)
↓ (verify)
read → query / get
Cross-platform
- macOS / Linux: native CLI works flawlessly
- Windows PowerShell: read commands (
shape/fields/get/query/ls/extract/concat) work fine via CLI. Write commands strip double quotes through PowerShell, so complex values fail — use the Python API instead
Windows write Python API:
import sys
sys.path.insert(0, '.')
from jsonseek.commands.set_cmd import set_value
from jsonseek.commands.add_cmd import add_value
from jsonseek.commands.append_cmd import append_value
from jsonseek.commands.extend_cmd import extend_value
from jsonseek.commands.del_cmd import del_value
from jsonseek.commands.replaceline_cmd import replace_line
# Set/Add/Append/Extend complex values — no shell quoting issues
set_value('file.json', 'path', {"key": "value"})
add_value('file.json', 'path', ["item1", "item2"])
append_value('file.json', 'items', {"id": 1})
extend_value('file.json', 'items', [{"id": 2}, {"id": 3}])
# Delete
del_value('file.json', 'path')
# JSONL whole-line replacement
replace_line('file.jsonl', 5, '{"id": 5, "name": "fixed"}')
CLI write commands print a patch preview on success and Error: ... on failure. Python API write helpers are silent on success and raise on failure.
Command reference docs
| Doc | Content |
|---|---|
| commands.md | Every command's flags, parameters, examples |
| path-syntax.md | Full path syntax — dot / bracket / mixed / array indices / negative indices / escapes |
Skills links are also given earlier in the "🤖 Skills for LLM Coding Agents" section.
🔗 Links
| Resource | Link |
|---|---|
| PyPI | https://pypi.org/project/jsonseek/ |
| GitHub | https://github.com/lo2589/jsonseek |
| Issues | https://github.com/lo2589/jsonseek/issues |
Other languages
- English — README_EN.md
- 中文 — README.md (default, also serves as the Chinese edition)
- 中文 (简洁版) — README_ZH.md
License
MIT — see LICENSE.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jsonseek-0.1.3.tar.gz.
File metadata
- Download URL: jsonseek-0.1.3.tar.gz
- Upload date:
- Size: 47.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c91143372a6a1bc877bd88493faf039bb3f510c34564e8dac55cc6393954bcde
|
|
| MD5 |
9ee7da1f4e64d4994a699a065ed81d20
|
|
| BLAKE2b-256 |
5a966c1cd06df2e452409d695f32889e8f12a56cb3e9973b8280abad5fe9f605
|
File details
Details for the file jsonseek-0.1.3-py3-none-any.whl.
File metadata
- Download URL: jsonseek-0.1.3-py3-none-any.whl
- Upload date:
- Size: 56.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4bce0b8b88b0810be998fec00226f2d714a2c5f8fb62a138b85c757068ad34f2
|
|
| MD5 |
cb931423be906e8ce584ad9d99e7b1d9
|
|
| BLAKE2b-256 |
c8acaeea721867088fdc56b9c64b6199ce0a1637bc4e786904f2f04140fb6051
|