Version 9 of JQ

Updated 2015-01-29 18:56:42 by dbohdan

JQ is short for Jamshed Qureshi


jq is also a command-line tool for *nix and Windows for manipulating JSON data.

dbohdan 2015-01-29: You can use jq from Tcl, which can be faster than using Tcllib JSON when you only need a few values from a large JSON blob. It understands complex queries (called "filters") from .weather0.description to paths | map(tostring) | join("/") | unique to the one defined in the module below.

What follows is a small Tcl module to run jq that works in Tcl 8.5+ and Jim Tcl. Note that ::jq::2dict is generally slower than ::json::json2dict (37 vs. 21 seconds to process a 10 MiB JSON file in Tcl 8.6.3). It is provided for the convenience of not having to import another package as well as for when you want

  1. your JSON arrays to be converted to dicts with integer keys (e.g., "a", "b", "c" to {0 a 1 b 2 c} rather than {a b c});
  2. a JSON parser in Jim Tcl faster than the recursive one from jimhttp.

The first point means that you can access data converted from JSON dict get $jsonDict key1 0 key2 instead of having to alternate between dict get and lindex.

# jq-0.2.1.tm
namespace eval jq {
    proc jq {filter data {options {-r}}} {
        exec jq {*}$options $filter << $data
    }
    proc 2dict {data} {
        jq {
            def totcl:
                if type == "array" then
                    # Convert array to object with keys 0, 1, 2... and process
                    # it as object.
                    [range(0;length) as $i
                    | {key: $i | tostring, value: .[$i]}]
                    | from_entries
                    | totcl
                elif type == "object" then
                    .
                    | to_entries
                    | map("{\(.key)} {\(.value | totcl)}")
                    | join(" ")
                else
                    tostring
                    | split("{") | join ("\\{")
                    | split("}") | join ("\\}")
                end;
            . | totcl
        } $data
    }
}

dbohdan: I hope Jamshed doesn't mind me using this page. If he objects I will create a separate page for jq the program.