Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.openwrt.org/project/libubox.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/sh
diff options
context:
space:
mode:
authorHans Dedecker <dedeckeh@gmail.com>2018-02-01 18:41:27 +0300
committerHans Dedecker <dedeckeh@gmail.com>2018-02-08 14:15:20 +0300
commitbb0c830b2a259b7c5ffa7c309ce9d3004f3c41a1 (patch)
tree2b671181001077cc516583742281bc0bb4ed1189 /sh
parent9c4aeda96220b3f0d097d153bedd328f71f382bf (diff)
sh/jshn.sh: add json_for_each_item()
Function usefull to iterate through the different elements of an array or object; the provided callback function is called for each element which is passed the value, key and user provided arguments. For field types different from array or object the callback is called with the retrieved value. Signed-off-by: Hans Dedecker <dedeckeh@gmail.com> Acked-by: Jo-Philipp Wich <jo@mein.io>
Diffstat (limited to 'sh')
-rw-r--r--sh/jshn.sh25
1 files changed, 25 insertions, 0 deletions
diff --git a/sh/jshn.sh b/sh/jshn.sh
index 66baccb..7b0155d 100644
--- a/sh/jshn.sh
+++ b/sh/jshn.sh
@@ -288,3 +288,28 @@ json_is_a() {
json_get_type type "$1"
[ "$type" = "$2" ]
}
+
+json_for_each_item() {
+ [ "$#" -ge 2 ] || return 0
+ local function="$1"; shift
+ local target="$1"; shift
+ local type val
+
+ json_get_type type "$target"
+ case "$type" in
+ object|array)
+ local keys key
+ json_select "$target"
+ json_get_keys keys
+ for key in $keys; do
+ json_get_var val "$key"
+ eval "$function \"\$val\" \"\$key\" \"\$@\""
+ done
+ json_select ..
+ ;;
+ *)
+ json_get_var val "$target"
+ eval "$function \"\$val\" \"\" \"\$@\""
+ ;;
+ esac
+}