Skip to main content

jsonc-edit

A Python interface to Microsoft's jsonc-parser, designed for source-preserving JSONC edits.

What it is

jsonc-edit is a lightweight Python package that provides surgical source-editing capabilities for JSONC (JSON with Comments) files. Instead of providing standard JSON parsing and dumping, it wraps Microsoft's world-class AST-aware jsonc-parser library under the hood, giving you exact, developer-grade source manipulation in Python.

Why it exists

When modifying configuration files (like tsconfig.json or .vscode/settings.json), the standard programmatic approach is highly destructive:

parse source string → modify Python dict in memory → dump back to string

This naive approach immediately strips all // line comments, /* block comments */, trailing commas, and completely mangles the developer's original indentation and formatting choices.

jsonc-edit uses a fundamentally different approach:

semantic JSONC edit → generate precise text offset edits → apply edits to raw string

By analyzing the AST and applying surgical character replacements, jsonc-edit perfectly preserves all human-authored elements in the file, including neighboring comments and specific array formatting.

Scope

jsonc-edit is intended to be a reusable, generalized JSONC source-editing library. It is strictly scoped to this purpose.

It is not:

  • A tsconfig.json manager.
  • A framework-specific plugin or library.
  • A full JSONC configuration framework that validates schemas or paths.

Installation

pip install jsonc-edit

Runtime Prerequisites

Because jsonc-edit leverages the official Microsoft parser to ensure exact semantic correctness, it runs a tiny invisible Node.js daemon under the hood to process the edits.

You must have node and npm installed and available on your system path. During its first execution, jsonc-edit will automatically install the necessary pinned parser package into an isolated user-level cache (~/.jsonc-edit/versions/). It does not pollute your project's node_modules.

Basic Example

from jsonc_edit import modify, apply_edits

source = """{
  // My custom aliases
  "compilerOptions": {
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}"""

# Generate the specific string manipulations needed
edits = modify(
    source,
    ["compilerOptions", "paths", "@example"],
    ["./types.d.ts"],
)

# Apply them to the raw source code
result = apply_edits(source, edits)

print(result)

The output will safely insert the new alias while completely respecting the existing // My custom aliases comment and the surrounding whitespace preferences.

Important Semantics

Because jsonc-edit uses Microsoft's parser engine, you inherit its intelligent formatting behavior natively:

  • Comments: // and /* */ comments anywhere in the file are perfectly preserved.
  • Trailing Commas: Existing trailing commas on unaffected properties remain untouched.
  • Formatting: You can optionally pass options={"formattingOptions": {"insertSpaces": True, "tabSize": 4}} to modify() to ensure any newly scaffolded objects match your project's preferred spacing.
  • Existing Values: Modifying a deeply nested property that does not exist yet (e.g., ["compilerOptions", "paths", "new"] on an empty {} file) will correctly and cleanly scaffold out the missing compilerOptions and paths objects for you.
  • Idempotency: Attempting to set an array or object that is already functionally identical may still result in edits if the underlying parser chooses to reformat the specific block to match uniform JSON spacing.
  • Errors: Invalid operations or syntax crashes will natively bubble up into Python as a JsoncParseError. Missing Node/NPM environments will raise a RuntimeBootstrapError.

Architecture

jsonc-edit uses a persistent, line-buffered Node.js daemon managed directly by Python. This means:

  1. It does not spawn a new Node process for every edit. It boots once.
  2. It communicates blisteringly fast via newline-delimited JSON over stdin/stdout.
  3. It cleanly shuts down alongside the Python interpreter via atexit hooks.

You do not need to manage this daemon yourself. It operates entirely transparently behind the modify and apply_edits functions. If you need explicit deterministic lifecycle management, a context manager is available:

from jsonc_edit import edit_session, modify

with edit_session():
    edits = modify("{}", ["a"], 1)

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

jsonc_edit-0.1.0.tar.gz (84.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

jsonc_edit-0.1.0-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file jsonc_edit-0.1.0.tar.gz.

File metadata

  • Download URL: jsonc_edit-0.1.0.tar.gz
  • Upload date:
  • Size: 84.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for jsonc_edit-0.1.0.tar.gz
Algorithm Hash digest
SHA256 cfbae7b91aa774ae42f472a5527e39d00bda801d9271a1c7b1b1972f02f9073e
MD5 d00f2cb72b223e20492fd955cedd6c58
BLAKE2b-256 ddbc456591485a91e511fedcd620e2601724b8668dfec3b87fc2cd2f0515a965

See more details on using hashes here.

File details

Details for the file jsonc_edit-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: jsonc_edit-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 9.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for jsonc_edit-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 eae51f3f13a1d332a2c905993aa00cc6ea459770cbf3b3fdcca29175c5cf805c
MD5 418a82e39e0bd3b12236e7927ca628d8
BLAKE2b-256 ddb71a5f319afb6367373fd4277d2bd615d815cb39554fde3c5f75f8ac0a311d

See more details on using hashes here.

Release history Release notifications | RSS feed

0.2.1

2 files

0.2.0

2 files

This release

0.1.0 This release

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page