Skip to content

Repository files navigation

jse - JSON Editor PyPibuild statuscodecov

quickly edit json files from the command line

jse is pragmatic and terse. It lets you edit json fast, without needing to care about quotes, types, exact indexes, or any of the stuff that makes json a pain.

Usage

$ jse FILE COMMAND QUERY VALUE

TLDR Version

edit an existing key: e or edit

$ jse config.json edit app.version 0.3.3

add a new element: a or add

$ jse todo.json add list.shopping {task:eggs,done:false}

delete a value: d or delete

$ jse problems.json delete problems[99]

full examples with json files below

Installing

pip3 install jse

Running from Source

Requirements:

Steps:

  1. clone the repository
  2. install click pip3 install click
  3. make the run script executable chmod +x run.py
  4. place jse on the path ln -s /path/to/run.py ~/.local/bin/jse

Using poetry is recommended if you plan to contribute

$ pip3 install poetry
$ poetry install
$ poetry shell

Examples

Assume this json file is in the current directory

# example.json
{
"users": [
{"name": "alice", "age": 21, "admin": false},
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

To delete the user alice using jse, all we need to do is specify d or delete mode and the path to her user object

$ jse example.json d users[0]

We can use both index or dot notation.

$ jse example.json d users.0 #users.first or users.^ also work
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

Now lets make charlie an admin. To edit an existing field, use the edit command with e or edit. Edit takes a key to change and its new value.

$ jse example.json e users.1.admin true
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": true}
]
}

jse is smart enough to infer datatypes from the command line. it can also accept complex nested objects and arrays in a terse, quote-free format. Lets add a new nested field to the file with add or a

$ jse example.json a highscore [{score:32.5,user:bob,metadata:{ip:192.168.1.102,client:firefox}}]
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": 32.5,
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
}
]
}

jse also understands lists, so you can add new elements to one without needing an explicit index. It will infer we are trying to append from add instead of changing the list itself to an object (edit)

$ jse example.json a highscore {score:52,user:charlie}
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

first and last (or ^ and $) can also be used as a list index for any operation

$ jse example.json a users.first {name:jon,age:22,admin:false}
{
"users": [
{ "name": "jon", "age": 22, "admin": false },
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

jse's error messages are informative, because no one wants a generic KeyError

$ jse example.json a users.0.name "not bob"
'name' already has a value. Use the edit command to modify it
$ jse example.json d users[2]
There is no element with index 2. The largest index is 1

You can also delete mulitple keys in one command `` $ jse example.json d users.0.age users.1.age users.2.age

```json
{
"users": [
{
"name": "jon",
"admin": false,
},
{
"name": "bob",
"admin": true,
},
{
"name": "charlie",
"admin": true
}
]
...
}

No need to specify every element, just use the * or all operator

$ jse example.json d users.*.age # or users.all.age

About

cli JSON editor

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - bjubes/jse: cli JSON editor · GitHub
Skip to content

Repository files navigation

jse - JSON Editor PyPibuild statuscodecov

quickly edit json files from the command line

jse is pragmatic and terse. It lets you edit json fast, without needing to care about quotes, types, exact indexes, or any of the stuff that makes json a pain.

Usage

$ jse FILE COMMAND QUERY VALUE

TLDR Version

edit an existing key: e or edit

$ jse config.json edit app.version 0.3.3

add a new element: a or add

$ jse todo.json add list.shopping {task:eggs,done:false}

delete a value: d or delete

$ jse problems.json delete problems[99]

full examples with json files below

Installing

pip3 install jse

Running from Source

Requirements:

Steps:

  1. clone the repository
  2. install click pip3 install click
  3. make the run script executable chmod +x run.py
  4. place jse on the path ln -s /path/to/run.py ~/.local/bin/jse

Using poetry is recommended if you plan to contribute

$ pip3 install poetry
$ poetry install
$ poetry shell

Examples

Assume this json file is in the current directory

# example.json
{
"users": [
{"name": "alice", "age": 21, "admin": false},
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

To delete the user alice using jse, all we need to do is specify d or delete mode and the path to her user object

$ jse example.json d users[0]

We can use both index or dot notation.

$ jse example.json d users.0 #users.first or users.^ also work
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

Now lets make charlie an admin. To edit an existing field, use the edit command with e or edit. Edit takes a key to change and its new value.

$ jse example.json e users.1.admin true
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": true}
]
}

jse is smart enough to infer datatypes from the command line. it can also accept complex nested objects and arrays in a terse, quote-free format. Lets add a new nested field to the file with add or a

$ jse example.json a highscore [{score:32.5,user:bob,metadata:{ip:192.168.1.102,client:firefox}}]
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": 32.5,
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
}
]
}

jse also understands lists, so you can add new elements to one without needing an explicit index. It will infer we are trying to append from add instead of changing the list itself to an object (edit)

$ jse example.json a highscore {score:52,user:charlie}
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

first and last (or ^ and $) can also be used as a list index for any operation

$ jse example.json a users.first {name:jon,age:22,admin:false}
{
"users": [
{ "name": "jon", "age": 22, "admin": false },
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

jse's error messages are informative, because no one wants a generic KeyError

$ jse example.json a users.0.name "not bob"
'name' already has a value. Use the edit command to modify it
$ jse example.json d users[2]
There is no element with index 2. The largest index is 1

You can also delete mulitple keys in one command `` $ jse example.json d users.0.age users.1.age users.2.age

```json
{
"users": [
{
"name": "jon",
"admin": false,
},
{
"name": "bob",
"admin": true,
},
{
"name": "charlie",
"admin": true
}
]
...
}

No need to specify every element, just use the * or all operator

$ jse example.json d users.*.age # or users.all.age

About

cli JSON editor

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - bjubes/jse: cli JSON editor · GitHub
Skip to content

Repository files navigation

jse - JSON Editor PyPibuild statuscodecov

quickly edit json files from the command line

jse is pragmatic and terse. It lets you edit json fast, without needing to care about quotes, types, exact indexes, or any of the stuff that makes json a pain.

Usage

$ jse FILE COMMAND QUERY VALUE

TLDR Version

edit an existing key: e or edit

$ jse config.json edit app.version 0.3.3

add a new element: a or add

$ jse todo.json add list.shopping {task:eggs,done:false}

delete a value: d or delete

$ jse problems.json delete problems[99]

full examples with json files below

Installing

pip3 install jse

Running from Source

Requirements:

Steps:

  1. clone the repository
  2. install click pip3 install click
  3. make the run script executable chmod +x run.py
  4. place jse on the path ln -s /path/to/run.py ~/.local/bin/jse

Using poetry is recommended if you plan to contribute

$ pip3 install poetry
$ poetry install
$ poetry shell

Examples

Assume this json file is in the current directory

# example.json
{
"users": [
{"name": "alice", "age": 21, "admin": false},
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

To delete the user alice using jse, all we need to do is specify d or delete mode and the path to her user object

$ jse example.json d users[0]

We can use both index or dot notation.

$ jse example.json d users.0 #users.first or users.^ also work
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

Now lets make charlie an admin. To edit an existing field, use the edit command with e or edit. Edit takes a key to change and its new value.

$ jse example.json e users.1.admin true
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": true}
]
}

jse is smart enough to infer datatypes from the command line. it can also accept complex nested objects and arrays in a terse, quote-free format. Lets add a new nested field to the file with add or a

$ jse example.json a highscore [{score:32.5,user:bob,metadata:{ip:192.168.1.102,client:firefox}}]
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": 32.5,
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
}
]
}

jse also understands lists, so you can add new elements to one without needing an explicit index. It will infer we are trying to append from add instead of changing the list itself to an object (edit)

$ jse example.json a highscore {score:52,user:charlie}
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

first and last (or ^ and $) can also be used as a list index for any operation

$ jse example.json a users.first {name:jon,age:22,admin:false}
{
"users": [
{ "name": "jon", "age": 22, "admin": false },
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

jse's error messages are informative, because no one wants a generic KeyError

$ jse example.json a users.0.name "not bob"
'name' already has a value. Use the edit command to modify it
$ jse example.json d users[2]
There is no element with index 2. The largest index is 1

You can also delete mulitple keys in one command `` $ jse example.json d users.0.age users.1.age users.2.age

```json
{
"users": [
{
"name": "jon",
"admin": false,
},
{
"name": "bob",
"admin": true,
},
{
"name": "charlie",
"admin": true
}
]
...
}

No need to specify every element, just use the * or all operator

$ jse example.json d users.*.age # or users.all.age

About

cli JSON editor

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - bjubes/jse: cli JSON editor · GitHub
Skip to content

Repository files navigation

jse - JSON Editor PyPibuild statuscodecov

quickly edit json files from the command line

jse is pragmatic and terse. It lets you edit json fast, without needing to care about quotes, types, exact indexes, or any of the stuff that makes json a pain.

Usage

$ jse FILE COMMAND QUERY VALUE

TLDR Version

edit an existing key: e or edit

$ jse config.json edit app.version 0.3.3

add a new element: a or add

$ jse todo.json add list.shopping {task:eggs,done:false}

delete a value: d or delete

$ jse problems.json delete problems[99]

full examples with json files below

Installing

pip3 install jse

Running from Source

Requirements:

Steps:

  1. clone the repository
  2. install click pip3 install click
  3. make the run script executable chmod +x run.py
  4. place jse on the path ln -s /path/to/run.py ~/.local/bin/jse

Using poetry is recommended if you plan to contribute

$ pip3 install poetry
$ poetry install
$ poetry shell

Examples

Assume this json file is in the current directory

# example.json
{
"users": [
{"name": "alice", "age": 21, "admin": false},
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

To delete the user alice using jse, all we need to do is specify d or delete mode and the path to her user object

$ jse example.json d users[0]

We can use both index or dot notation.

$ jse example.json d users.0 #users.first or users.^ also work
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

Now lets make charlie an admin. To edit an existing field, use the edit command with e or edit. Edit takes a key to change and its new value.

$ jse example.json e users.1.admin true
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": true}
]
}

jse is smart enough to infer datatypes from the command line. it can also accept complex nested objects and arrays in a terse, quote-free format. Lets add a new nested field to the file with add or a

$ jse example.json a highscore [{score:32.5,user:bob,metadata:{ip:192.168.1.102,client:firefox}}]
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": 32.5,
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
}
]
}

jse also understands lists, so you can add new elements to one without needing an explicit index. It will infer we are trying to append from add instead of changing the list itself to an object (edit)

$ jse example.json a highscore {score:52,user:charlie}
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

first and last (or ^ and $) can also be used as a list index for any operation

$ jse example.json a users.first {name:jon,age:22,admin:false}
{
"users": [
{ "name": "jon", "age": 22, "admin": false },
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

jse's error messages are informative, because no one wants a generic KeyError

$ jse example.json a users.0.name "not bob"
'name' already has a value. Use the edit command to modify it
$ jse example.json d users[2]
There is no element with index 2. The largest index is 1

You can also delete mulitple keys in one command `` $ jse example.json d users.0.age users.1.age users.2.age

```json
{
"users": [
{
"name": "jon",
"admin": false,
},
{
"name": "bob",
"admin": true,
},
{
"name": "charlie",
"admin": true
}
]
...
}

No need to specify every element, just use the * or all operator

$ jse example.json d users.*.age # or users.all.age

About

cli JSON editor

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - bjubes/jse: cli JSON editor · GitHub
Skip to content

Repository files navigation

jse - JSON Editor PyPibuild statuscodecov

quickly edit json files from the command line

jse is pragmatic and terse. It lets you edit json fast, without needing to care about quotes, types, exact indexes, or any of the stuff that makes json a pain.

Usage

$ jse FILE COMMAND QUERY VALUE

TLDR Version

edit an existing key: e or edit

$ jse config.json edit app.version 0.3.3

add a new element: a or add

$ jse todo.json add list.shopping {task:eggs,done:false}

delete a value: d or delete

$ jse problems.json delete problems[99]

full examples with json files below

Installing

pip3 install jse

Running from Source

Requirements:

Steps:

  1. clone the repository
  2. install click pip3 install click
  3. make the run script executable chmod +x run.py
  4. place jse on the path ln -s /path/to/run.py ~/.local/bin/jse

Using poetry is recommended if you plan to contribute

$ pip3 install poetry
$ poetry install
$ poetry shell

Examples

Assume this json file is in the current directory

# example.json
{
"users": [
{"name": "alice", "age": 21, "admin": false},
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

To delete the user alice using jse, all we need to do is specify d or delete mode and the path to her user object

$ jse example.json d users[0]

We can use both index or dot notation.

$ jse example.json d users.0 #users.first or users.^ also work
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

Now lets make charlie an admin. To edit an existing field, use the edit command with e or edit. Edit takes a key to change and its new value.

$ jse example.json e users.1.admin true
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": true}
]
}

jse is smart enough to infer datatypes from the command line. it can also accept complex nested objects and arrays in a terse, quote-free format. Lets add a new nested field to the file with add or a

$ jse example.json a highscore [{score:32.5,user:bob,metadata:{ip:192.168.1.102,client:firefox}}]
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": 32.5,
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
}
]
}

jse also understands lists, so you can add new elements to one without needing an explicit index. It will infer we are trying to append from add instead of changing the list itself to an object (edit)

$ jse example.json a highscore {score:52,user:charlie}
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

first and last (or ^ and $) can also be used as a list index for any operation

$ jse example.json a users.first {name:jon,age:22,admin:false}
{
"users": [
{ "name": "jon", "age": 22, "admin": false },
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

jse's error messages are informative, because no one wants a generic KeyError

$ jse example.json a users.0.name "not bob"
'name' already has a value. Use the edit command to modify it
$ jse example.json d users[2]
There is no element with index 2. The largest index is 1

You can also delete mulitple keys in one command `` $ jse example.json d users.0.age users.1.age users.2.age

```json
{
"users": [
{
"name": "jon",
"admin": false,
},
{
"name": "bob",
"admin": true,
},
{
"name": "charlie",
"admin": true
}
]
...
}

No need to specify every element, just use the * or all operator

$ jse example.json d users.*.age # or users.all.age

About

cli JSON editor

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - bjubes/jse: cli JSON editor · GitHub
Skip to content

Repository files navigation

jse - JSON Editor PyPibuild statuscodecov

quickly edit json files from the command line

jse is pragmatic and terse. It lets you edit json fast, without needing to care about quotes, types, exact indexes, or any of the stuff that makes json a pain.

Usage

$ jse FILE COMMAND QUERY VALUE

TLDR Version

edit an existing key: e or edit

$ jse config.json edit app.version 0.3.3

add a new element: a or add

$ jse todo.json add list.shopping {task:eggs,done:false}

delete a value: d or delete

$ jse problems.json delete problems[99]

full examples with json files below

Installing

pip3 install jse

Running from Source

Requirements:

Steps:

  1. clone the repository
  2. install click pip3 install click
  3. make the run script executable chmod +x run.py
  4. place jse on the path ln -s /path/to/run.py ~/.local/bin/jse

Using poetry is recommended if you plan to contribute

$ pip3 install poetry
$ poetry install
$ poetry shell

Examples

Assume this json file is in the current directory

# example.json
{
"users": [
{"name": "alice", "age": 21, "admin": false},
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

To delete the user alice using jse, all we need to do is specify d or delete mode and the path to her user object

$ jse example.json d users[0]

We can use both index or dot notation.

$ jse example.json d users.0 #users.first or users.^ also work
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

Now lets make charlie an admin. To edit an existing field, use the edit command with e or edit. Edit takes a key to change and its new value.

$ jse example.json e users.1.admin true
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": true}
]
}

jse is smart enough to infer datatypes from the command line. it can also accept complex nested objects and arrays in a terse, quote-free format. Lets add a new nested field to the file with add or a

$ jse example.json a highscore [{score:32.5,user:bob,metadata:{ip:192.168.1.102,client:firefox}}]
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": 32.5,
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
}
]
}

jse also understands lists, so you can add new elements to one without needing an explicit index. It will infer we are trying to append from add instead of changing the list itself to an object (edit)

$ jse example.json a highscore {score:52,user:charlie}
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

first and last (or ^ and $) can also be used as a list index for any operation

$ jse example.json a users.first {name:jon,age:22,admin:false}
{
"users": [
{ "name": "jon", "age": 22, "admin": false },
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

jse's error messages are informative, because no one wants a generic KeyError

$ jse example.json a users.0.name "not bob"
'name' already has a value. Use the edit command to modify it
$ jse example.json d users[2]
There is no element with index 2. The largest index is 1

You can also delete mulitple keys in one command `` $ jse example.json d users.0.age users.1.age users.2.age

```json
{
"users": [
{
"name": "jon",
"admin": false,
},
{
"name": "bob",
"admin": true,
},
{
"name": "charlie",
"admin": true
}
]
...
}

No need to specify every element, just use the * or all operator

$ jse example.json d users.*.age # or users.all.age

About

cli JSON editor

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - bjubes/jse: cli JSON editor · GitHub
Skip to content

Repository files navigation

jse - JSON Editor PyPibuild statuscodecov

quickly edit json files from the command line

jse is pragmatic and terse. It lets you edit json fast, without needing to care about quotes, types, exact indexes, or any of the stuff that makes json a pain.

Usage

$ jse FILE COMMAND QUERY VALUE

TLDR Version

edit an existing key: e or edit

$ jse config.json edit app.version 0.3.3

add a new element: a or add

$ jse todo.json add list.shopping {task:eggs,done:false}

delete a value: d or delete

$ jse problems.json delete problems[99]

full examples with json files below

Installing

pip3 install jse

Running from Source

Requirements:

Steps:

  1. clone the repository
  2. install click pip3 install click
  3. make the run script executable chmod +x run.py
  4. place jse on the path ln -s /path/to/run.py ~/.local/bin/jse

Using poetry is recommended if you plan to contribute

$ pip3 install poetry
$ poetry install
$ poetry shell

Examples

Assume this json file is in the current directory

# example.json
{
"users": [
{"name": "alice", "age": 21, "admin": false},
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

To delete the user alice using jse, all we need to do is specify d or delete mode and the path to her user object

$ jse example.json d users[0]

We can use both index or dot notation.

$ jse example.json d users.0 #users.first or users.^ also work
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

Now lets make charlie an admin. To edit an existing field, use the edit command with e or edit. Edit takes a key to change and its new value.

$ jse example.json e users.1.admin true
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": true}
]
}

jse is smart enough to infer datatypes from the command line. it can also accept complex nested objects and arrays in a terse, quote-free format. Lets add a new nested field to the file with add or a

$ jse example.json a highscore [{score:32.5,user:bob,metadata:{ip:192.168.1.102,client:firefox}}]
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": 32.5,
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
}
]
}

jse also understands lists, so you can add new elements to one without needing an explicit index. It will infer we are trying to append from add instead of changing the list itself to an object (edit)

$ jse example.json a highscore {score:52,user:charlie}
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

first and last (or ^ and $) can also be used as a list index for any operation

$ jse example.json a users.first {name:jon,age:22,admin:false}
{
"users": [
{ "name": "jon", "age": 22, "admin": false },
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

jse's error messages are informative, because no one wants a generic KeyError

$ jse example.json a users.0.name "not bob"
'name' already has a value. Use the edit command to modify it
$ jse example.json d users[2]
There is no element with index 2. The largest index is 1

You can also delete mulitple keys in one command `` $ jse example.json d users.0.age users.1.age users.2.age

```json
{
"users": [
{
"name": "jon",
"admin": false,
},
{
"name": "bob",
"admin": true,
},
{
"name": "charlie",
"admin": true
}
]
...
}

No need to specify every element, just use the * or all operator

$ jse example.json d users.*.age # or users.all.age

About

cli JSON editor

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - bjubes/jse: cli JSON editor · GitHub
Skip to content

Repository files navigation

jse - JSON Editor PyPibuild statuscodecov

quickly edit json files from the command line

jse is pragmatic and terse. It lets you edit json fast, without needing to care about quotes, types, exact indexes, or any of the stuff that makes json a pain.

Usage

$ jse FILE COMMAND QUERY VALUE

TLDR Version

edit an existing key: e or edit

$ jse config.json edit app.version 0.3.3

add a new element: a or add

$ jse todo.json add list.shopping {task:eggs,done:false}

delete a value: d or delete

$ jse problems.json delete problems[99]

full examples with json files below

Installing

pip3 install jse

Running from Source

Requirements:

Steps:

  1. clone the repository
  2. install click pip3 install click
  3. make the run script executable chmod +x run.py
  4. place jse on the path ln -s /path/to/run.py ~/.local/bin/jse

Using poetry is recommended if you plan to contribute

$ pip3 install poetry
$ poetry install
$ poetry shell

Examples

Assume this json file is in the current directory

# example.json
{
"users": [
{"name": "alice", "age": 21, "admin": false},
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

To delete the user alice using jse, all we need to do is specify d or delete mode and the path to her user object

$ jse example.json d users[0]

We can use both index or dot notation.

$ jse example.json d users.0 #users.first or users.^ also work
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": false}
]
}

Now lets make charlie an admin. To edit an existing field, use the edit command with e or edit. Edit takes a key to change and its new value.

$ jse example.json e users.1.admin true
# example.json
{
"users": [
{"name": "bob", "age": 57, "admin": true},
{"name": "charlie", "age": 37, "admin": true}
]
}

jse is smart enough to infer datatypes from the command line. it can also accept complex nested objects and arrays in a terse, quote-free format. Lets add a new nested field to the file with add or a

$ jse example.json a highscore [{score:32.5,user:bob,metadata:{ip:192.168.1.102,client:firefox}}]
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": 32.5,
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
}
]
}

jse also understands lists, so you can add new elements to one without needing an explicit index. It will infer we are trying to append from add instead of changing the list itself to an object (edit)

$ jse example.json a highscore {score:52,user:charlie}
{
"users": [
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

first and last (or ^ and $) can also be used as a list index for any operation

$ jse example.json a users.first {name:jon,age:22,admin:false}
{
"users": [
{ "name": "jon", "age": 22, "admin": false },
{ "name": "bob", "age": 57, "admin": true },
{ "name": "charlie", "age": 37, "admin": true }
],
"highscore": [
{
"score": "32.5",
"user": "bob",
"metadata": {
"ip": "192.168.1.102",
"client": "firefox"
}
},
{
"score": 52.0,
"user": "charlie"
}
]
}

jse's error messages are informative, because no one wants a generic KeyError

$ jse example.json a users.0.name "not bob"
'name' already has a value. Use the edit command to modify it
$ jse example.json d users[2]
There is no element with index 2. The largest index is 1

You can also delete mulitple keys in one command `` $ jse example.json d users.0.age users.1.age users.2.age

```json
{
"users": [
{
"name": "jon",
"admin": false,
},
{
"name": "bob",
"admin": true,
},
{
"name": "charlie",
"admin": true
}
]
...
}

No need to specify every element, just use the * or all operator

$ jse example.json d users.*.age # or users.all.age

About

cli JSON editor

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages