- [issue #40] Improve "Lookups" section of docs to show how to lookup non-identifier keys.
-
[pull #39, issue #34]
json -ga
streams. (Largely by Fred Kuo, github.com/fkuo) This means you can usejson
with an input stream of JSON objects. E.g.:yes '{"foo":"bar"}' | json -ga
Limitations: As was already a limitation of the '-g' switch, this only supports JSON objects delimited by newlines or with no space:
{"a":1}{"b":2} # good {"a":1}\n{"b":2} # good {"a":1} {"b":2} # bad
Additionally, currently only a stream of objects is supported, not a stream of arrays. Such are the typical use cases I've encountered.
-
[backward incompatible, issue #35] Special case the output for a single lookup AND JSON output (i.e.
-j
or-o json*
) to only output the value instead of the more general array or table that is necessary for multiple lookups. For objects:# Before: $ echo '{"one": "un", "two": "deux", "three": "troix"}' | json -j one { "one": "un" } # After: $ echo '{"one": "un", "two": "deux", "three": "troix"}' | jsondev -j one "un" # Unchanged: $ echo '{"one": "un", "two": "deux", "three": "troix"}' | jsondev -j one two { "one": "un", "two": "deux" }
For arrays:
# Before: $ echo '["a", "b", "c"]' | json -j 0 [ "a" ] # After: $ echo '["a", "b", "c"]' | jsondev -j 0 "a" # Unchanged: $ echo '["a", "b", "c"]' | jsondev -j 0 1 [ "a", "b" ]
The motivation for this change was (a) the WTF of the first example above and (b) issue #36 where one could no longer extract a single value using '-j' to explicitly get JSON string quoting.
- [issue #36] Turn off coloring for inspect output (
json -i
,json -o inspect
) if stdout is not a TTY.
-
Add
--validate
option to just validate (no processing and output)$ echo '{"foo" "bar"}' | json json: error: input is not JSON: Expected ':' instead of '"' at line 1, column 8: {"foo" "bar"} .......^ {"foo" "bar"} $ echo '{"foo" "bar"}' | json --validate json: error: input is not JSON: Expected ':' instead of '"' at line 1, column 8: {"foo" "bar"} .......^ $ echo '{"foo" "bar"}' | json --validate -q $ echo $? 1
-
Add
-f FILE
option for specifying an input file (or files) instead of stdin:$ json -f foo.json { "foo": "bar" } $ json -f foo.json foo bar
-
[Backward incompatible] Move "auto-arrayification" to require explicitly using the "-g" or "--group" option:
$ echo '{"one":"two"}{"three":"four"}' | json json: error: input is not JSON: Syntax error at line 1, column 14: {"one":"two"}{"three":"four"} .............^ {"one":"two"}{"three":"four"} $ echo '{"one":"two"}{"three":"four"}' | json -g -o json-0 [{"one":"two"},{"three":"four"}]
This is to avoid auto-arrayification accidentally making an invalid JSON object (with a missing comma) be transformed to a valid array:
$ cat oops.json { "a": { "b": [ {"foo": "bar"} {"foo": "bar"} ] } } $ cat oops.json | json3 -o json-0 [{"a":{"b":[{"foo":"bar"},{"foo":"bar"}]}}]
Basically the jusitification for this breaking change is that the invariant of
json
validating the input JSON is more important than the occassional convenience of grouping. -
Use 8 space indent for syntax error message on stderr instead of '\t'. Minor change. Tabs are evil.
-
Add
-k|--keys
option to output the input objects keys:$ echo '{"name": "trent", "age": 38}' | json -k [ "name", "age" ] $ echo '{"name": "trent", "age": 38}' | json -ka name age
-
Drop jsontool v2 dependency. This had been added for the first few json3 releases to provide a
json2
for comparison.json
v3 is fairing well enough now to not bother.
-
Support negative array indeces (a la Python list indeces), e.g.:
$ echo '["a", "b", "c"]' | json -- -1 c
- Update man page and move bulk examples from README to man page. Use ronn (the ruby one) instead of ronnjs: better and more reliable formatting. Add 'make docs' and 'make publish' (the latter to push to GH pages at http://trentm.com/json).
- [issue #31] Fix error message for
json -o
.
- [issue #32] Fix '-D' option processing so
json -D/
works (no space).
-
[pull #29] Add '-D' option to set a delimiter for lookups (default is '.'), so that this example works:
$ echo '{"a.b": {"b": 1}}' | json -D / a.b/b 1
By Yaniv Aknin.
-
[issue #30] Fix lookup strings with multiple double-quotes.
-
[issue #28] Don't error on a multi-level lookup where one of the components is undefined. E.g., the following is no longer an error:
$ echo '{"foo": "bar"}' | json not_foo.bar
- [issue #27] Fix issue handling multi-level lookups (e.g. 'json foo.bar').
- Fix a bogus 'json' dep.
-
Switched to json 3.x dev on master. "2.x" branch created for any necessary 2.x releases. See the 2.x changelog here.
-
[Backward incompatible] A significant change to 'jsony' default output and some use cases to increase utility. These changes necessitated a few backward incompatible changes. However, care was take to only break compat for (a) rare use cases and (b) where utility was much improved. See https://github.com/trentm/json/wiki/backward-incompat-json-3-changes for full details of backward incompatible changes.
-
New "conditional filtering" via the
-c CODE
option. If the input is an array, then-c
will automatically switch to processing each element of the array. Example:$ echo '[{"name":"trent", "age":38}, {"name":"ewan", "age":4}]' \ | json3 -c 'age>21' [ { "name": "trent", "age": 38 } ]
-
Change
-e CODE
option to automatically switch to array processing if the input is an array. This matches the behaviour of the new-c CODE
option. Example:$ echo '[{"name":"trent", "age":38}, {"name":"ewan", "age":4}]' \ | json3 -e 'age++' -o json-0 [{"name":"trent","age":39},{"name":"ewan","age":5}]
-
New '-A' option to force
-e
and-c
to process an input array as a single item. -
Add ansidiff-based colored diffs for test suite failures.
-
[issue #26] Add support for escapes in the delimiter given by
-d DELIM
:$ echo '[{"one":"un","two":"deux"},{"one":"uno","two":"dos"}]' \ | jsondev -a -d'\t' one two un deux uno dos
- Hack workaround for issue #24 to not get a spurious "process.stdout cannot be closed" from current node 0.6 versions. Note: currently this guard is only applied for node v0.6.0..v0.6.8 inclusive.
-
New "-e CODE" option to execute the given code on the input object; or, if '-a/--array' is given, then on each item in the input array. Execution is done before filtering.
$ echo '{"age": 38}' | json -e 'this.age++' { "age": 39 }
-
Improve error message when input is not JSON to include context and line and column position. This is implemented using a JSON parser from (https://github.com/douglascrockford/JSON-js). Example:
$ echo "[1,,2]" | json json: error: input is not JSON: Unexpected ',' at line 1, column 4: [1,,2] ...^ [1,,2]
-
Auto-arrayification: Drop support for arrayifying an array adjacent to an object. I.e. only arrayify adjacent objects or adjacent arrays.
-
Auto-arrayification: Change "arrayification" of adjacent arrays to be a single flat arrays of the input arrays' elements. Before:
$ echo '[1,2][3,4]' | bin/json [ [ 1, 2, ], [ 3, 4 ] ]
and now:
$ echo '[1,2][3,4]' | bin/json [ 1, 2, 3, 4 ]
This is expected to be more useful in practice.
-
Auto-arrayification: Allow JSON objects (or arrays) to be "arrayified" if not separated by any space. Previously a newline (at least) separation was required. So, for example, the following now works:
$ echo '{"a":1}{"b":2}' | bin/json -o json-0 [{"a":1},{"b":2}]
The rules for auto-arrayification then are: Objects and arrays only, separated by no space or space including a newline.
-
Fix stdout flushing in some cases.
- Add node v0.6 support. Drop v0.2 and v0.3 support.
- [issue#23] Fix output in '-a|--array' mode if one or more keys don't exist in one or more of the array items.
-
'-o | --output MODE' support. Supported modes:
jsony (default): JSON with string quotes elided json: JSON output, 2-space indent json-N: JSON output, N-space indent, e.g. 'json-4' inspect: node.js `util.inspect` output
-
'-a|--array' for independently processing each element of an input array.
$ echo '[ { "name": "Trent", "id": 12, "email": "[email protected]" }, { "name": "Mark", "id": 13, "email": "[email protected]" } ]' | json -a name email Trent [email protected] Mark [email protected]
This example shows that '-a' results in tabular output. The '-d' option can be used to specify a delimiter other than the default single space, e.g.:
json -d, -a field1 field2
[Backward Incompatibility] This is a replacement for the experimental '*' syntax in the lookup strings (previously enabled via '-x|--experimental'). That syntax and option has been removed.
-
Add '--' option processing support and error out if an unknown option is given.
-
Support multiple top-level JSON objects as input to mean a list of these object:
$ echo '{"one": 1} {"two": 1}' | ./lib/jsontool.js [ { "one": 1 }, { "two": 1 } ]
This can be nice to process a stream of JSON objects generated from multiple calls to another tool or
cat *.json | json
. Rules:-
Only JS objects and arrays. Don't see strong need for basic JS types right now and this limitation simplifies.
-
The break between JS objects has to include a newline. I.e. good:
{"one": 1} {"two": 2}
bad:
{"one": 1}{"two": 2}
This condition should be fine for typical use cases and ensures no false matches inside JS strings.
-
- [issue #9] Gracefully handle EPIPE (i.e. stdout being closed on json before it is finished writing).
-
[issue #19] Allow multiple lookup arguments:
$ echo '{"one": 1, "two": 2}' | json one two 1 2
WARNING: This involve a backward incompatible change in the JS APIs
jsontool.processDatum
andjsontool.processDatumExperimental
.
- [issue #18] Fix
json --version
for standalone mode again (was broken in json 1.3.3).
- WARNING:
json --version
is broken when running outside the source (or npm install'd) tree. I.e. this is a bad release for standalone. - [issue #17] Ensure stdout is flushed on exit.
- [issue #16] Fix to use
<regex object>.exec
instead of using the regex object as a function -- no longer allowed in the v8 used in node v0.5.x.
-
Make "jsontool" require'able as a module. For example, you can now:
$ npm install jsontool $ node > var jsontool = require('jsontool') > jsontool.parseLookup('a.b.c') [ 'a', 'b', 'c' ] > jsontool.parseLookup('my-key.0["bar"]') [ 'my-key', '0', '["bar"]' ] > jsontool.main(['', '', '--help']) Usage: <something generating JSON on stdout> | json [options] [lookup] ...
Currently other exported API is experimental and will likely change to be more generally useful (e.g. the current
processDatum
isn't all handy for module usage).Note: For command-line usage, the main module has moved from "json" to "lib/jsontool.js". So, if you are not using npm, you can setup the
json
command via something like:alias json='.../json/lib/jsontool.js'
-
package.json and publish to npm as "jsontool" ("json" name is taken)
-
Add experimental support for '*' in the lookup. This will extract all the elements of an array. Examples:
$ echo '["a", "b", "c"]' | json -x '*' a b c $ echo '[{"one": "un"}, {"two": "deux"}]' | json -x '*' { "one": "un" } { "two": "deux" } $ echo '[{"foo": "bar"}, {"foo": "baz"}]' | json -x '*.foo' bar baz
This is still experimental because I want to feel it out (is it useful? does it cause problems for regular usage?) and it is incomplete. The second example above shows that with '*', json can emit multiple JSON documents.
json
needs to change to support accepting multiple JSON documents.Also, a limitation: How to extract multiple fields from a list of objects? Is this even a necessary feature? Thinking out loud:
'*.{name,version}' # a la bash. Josh likes it. What else do you need?
-
Add '-x|--experimental' option to turn on incomplete/experimental features.
- [issue #12] Fix handling of output when result of lookup is
undefined
.
- [issue #10] Fix for node v0.5.
- [Issue 8] Don't emit a newline for empty output.
- [Issue 7] Handle "HTTP/1.1 100 Continue" leading header block.
- [Issue 4] Add a man page (using ronnjs).
-
[Issue 5] Fix getting a key with a period. E.g.:
echo '{"foo.bar": 42}' | json '["foo.bar"]'
json
is now doing much better lookup string parsing. Because escapes are now handled properly you can do the equivalent a little more easily:$ echo '{"foo.bar": 42}' | json foo\\.bar 42
- [Issue 6] Error exit value if invalid JSON.
- [Issue 2] Fix bracket notation:
echo '{"foo-bar": "baz"}' | json '["foo-bar"]'
(Started maintaining this log 19 March 2011. For earlier change information you'll have to dig into the commit history.)