summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEduardo Flores <eduardofv@gmail.com>2021-09-10 17:52:00 -0500
committerMarc Cornellà <hello@mcornella.com>2021-09-22 09:19:11 +0200
commit7ded6752fd34c513b0110b236c2ebd4fbbcd1a6f (patch)
tree15bff3d78c55ff675dcedd789c5beedb4966091c
parentb5909396370db43ba1c6c2513b1745991e5f60d0 (diff)
downloadzsh-7ded6752fd34c513b0110b236c2ebd4fbbcd1a6f.tar.gz
zsh-7ded6752fd34c513b0110b236c2ebd4fbbcd1a6f.tar.bz2
zsh-7ded6752fd34c513b0110b236c2ebd4fbbcd1a6f.zip
feat(jsontools): add tools to pretty print json-lines (ndjson) (#10176)
Co-authored-by: Marc Cornellà <hello@mcornella.com>
-rw-r--r--plugins/jsontools/README.md47
-rw-r--r--plugins/jsontools/jsontools.plugin.zsh10
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
+}