Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Fetching contributors…
Cannot retrieve contributors at this time
357 lines (238 sloc) 9.74 KB

json (aka jsontool) Changelog

Note: json3 is still pretty new. Use accordingly. Feedback very welcome!

json 3.0.0

  • 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 for full details of backward incompatible changes.

    For convenience for the first few json3 releases a "json2" command is installed to be able to test/compare new vs. old behaviour.

  • 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
  • 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

json 2.2.1

  • 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.

json 2.2.0

  • 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

json 2.1.0

  • Improve error message when input is not JSON to include context and line and column position. This is implemented using a JSON parser from ( Example:

      $ echo "[1,,2]" | json
      json: error: input is not JSON: Unexpected ',' at line 1, column 4:

json 2.0.3

  • 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

    and now:

      $ echo '[1,2][3,4]' | bin/json

    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

    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.

json 2.0.2

  • Add node v0.6 support. Drop v0.2 and v0.3 support.

json 2.0.1

  • [issue#23] Fix output in '-a|--array' mode if one or more keys don't exist in one or more of the array items.

json 2.0.0

  • '-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": ""
      "name": "Mark",
      "id": 13,
      "email": ""
    ]' | json -a name email

    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}


      {"one": 1}{"two": 2}

      This condition should be fine for typical use cases and ensures no false matches inside JS strings.

json 1.4.1

  • [issue #9] Gracefully handle EPIPE (i.e. stdout being closed on json before it is finished writing).

json 1.4.0

  • [issue #19] Allow multiple lookup arguments:

    $ echo '{"one": 1, "two": 2}' | json one two

    WARNING: This involve a backward incompatible change in the JS APIs jsontool.processDatum and jsontool.processDatumExperimental.

json 1.3.4

  • [issue #18] Fix json --version for standalone mode again (was broken in json 1.3.3).

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.

json 1.3.2

  • [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.

json 1.3.1

  • 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'

json 1.3.0

  • 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 '*'
      $ echo '[{"one": "un"}, {"two": "deux"}]' | json -x '*'
        "one": "un"
        "two": "deux"
      $ echo '[{"foo": "bar"}, {"foo": "baz"}]' | json -x '*.foo'

    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.

json 1.2.1

  • [issue #12] Fix handling of output when result of lookup is undefined.

json 1.2.0

  • [issue #10] Fix for node v0.5.

json 1.1.9

  • [Issue 8] Don't emit a newline for empty output.

json 1.1.8

  • [Issue 7] Handle "HTTP/1.1 100 Continue" leading header block.
  • [Issue 4] Add a man page (using ronnjs).

json 1.1.7

  • [Issue 5] Fix getting a key with a period. E.g.:

    echo '{"": 42}' | json '[""]'

    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 '{"": 42}' | json foo\\.bar

json 1.1.6

  • [Issue 6] Error exit value if invalid JSON.

json 1.1.4

  • [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.)

Jump to Line
Something went wrong with that request. Please try again.