Version 3 of JQ

Updated 2015-01-29 17:57:53 by dbohdan

JQ is short for Jamshed Qureshi


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

dbohdan 2015-01-29: You can use jq from Tcl. It is somewhat faster than the Tcllib JSON package and 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. If you only need a few values from a large JSON blob then running filters in jq itself is going to be noticeably faster than converting the data to a dictionary and using dict get to access it.

# jq-0.2.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.