From 7ded6752fd34c513b0110b236c2ebd4fbbcd1a6f Mon Sep 17 00:00:00 2001 From: Eduardo Flores Date: Fri, 10 Sep 2021 17:52:00 -0500 Subject: [PATCH] feat(jsontools): add tools to pretty print json-lines (ndjson) (#10176) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Cornellà --- plugins/jsontools/README.md | 47 +++++++++++++++++++++----- plugins/jsontools/jsontools.plugin.zsh | 10 +++++- 2 files changed, 48 insertions(+), 9 deletions(-) diff --git a/plugins/jsontools/README.md b/plugins/jsontools/README.md index 1fa2b8eed..6a2740014 100644 --- a/plugins/jsontools/README.md +++ b/plugins/jsontools/README.md @@ -17,32 +17,63 @@ Usage is simple... just take your json data and pipe it into the appropriate jso - `urlencode_json`: returns a url encoded string for the given json. - `urldecode_json`: returns decoded json for the given url encoded string. +### Supports NDJSON (Newline Delimited JSON) + +The plugin also supports [NDJSON](http://ndjson.org/) input, which means all functions +have an alternative function that reads and processes the input line by line. These +functions have the same name except using `ndjson` instead of `json`: + +> `pp_ndjson`, `is_ndjson`, `urlencode_ndjson`, `urldecode_ndjson`. + ### Examples - **pp_json**: -```sh +```console # curl json data and pretty print the results curl https://coderwall.com/bobwilliams.json | pp_json ``` - **is_json**: -```sh -# Validate if file's content conforms to a valid JSON schema -less data.json | is_json +```console +# validate if file's content conforms to a valid JSON schema +$ is_json < data.json +true +# shows true / false and returns the proper exit code +$ echo $? +0 ``` - **urlencode_json**: -```sh +```console # json data directly from the command line -echo '{"b":2, "a":1}' | urlencode_json +$ echo '{"b":2, "a":1}' | urlencode_json +%7B%22b%22:2,%20%22a%22:1%7D ``` - **urldecode_json**: -```sh +```console # url encoded string to decode -echo '%7B%22b%22:2,%20%22a%22:1%7D%0A' | urldecode_json +$ echo '%7B%22b%22:2,%20%22a%22:1%7D' | urldecode_json +{"b":2, "a":1} +``` + +- **pp_ndjson**: + +```console +# echo two separate json objects and pretty print both +$ echo '{"a": "b"}\n{"c": [1,2,3]}' | pp_ndjson +{ + "a": "b" +} +{ + "c": [ + 1, + 2, + 3 + ] +} ``` diff --git a/plugins/jsontools/jsontools.plugin.zsh b/plugins/jsontools/jsontools.plugin.zsh index b518288ad..ed45cfa8e 100644 --- a/plugins/jsontools/jsontools.plugin.zsh +++ b/plugins/jsontools/jsontools.plugin.zsh @@ -101,5 +101,13 @@ print(unquote_plus(sys.stdin.read())) } ;; esac - unset JSONTOOLS_METHOD + +## Add NDJSON support + +function {pp,is,urlencode,urldecode}_ndjson() { + local json jsonfunc="${0//ndjson/json}" + while read -r json; do + $jsonfunc <<< "$json" + done +}