From: Paul Hänsch Date: Sun, 25 Feb 2024 18:28:04 +0000 (+0100) Subject: more consistent db2/json structure and jpath selector X-Git-Url: http://git.plutz.net/?p=cgilite;a=commitdiff_plain;h=e1c0b4bed53401e2dfb5bfd3c561587db7e0e212 more consistent db2/json structure and jpath selector --- diff --git a/json.sh b/json.sh index 43026be..ba1539a 100755 --- a/json.sh +++ b/json.sh @@ -1,11 +1,11 @@ #!/bin/sh -# [ -n "$include_json" ] && return 0 -# include_json="$0" +[ -n "$include_json" ] && return 0 +include_json="$0" . "${_EXEC:-.}/cgilite/db23.sh" -debug(){ [ $# -gt 0 ] && printf '%s\n' "$@" >&2 || tee -a /dev/stderr; } +# debug(){ [ $# -gt 0 ] && printf '%s\n' "$@" >&2 || tee -a /dev/stderr; } json_except() { printf '%s\n' "$@" >&2; @@ -91,57 +91,7 @@ json_number() { return 1 fi - printf '%s %s\n' "num:${number%.000000}" "$json_document" -} - -json_value() { - local value json_document="$json_document" - json_type="" - - json_space - case $json_document in - \"*) - value="$(json_string)" || return 1 - json_document="${value#* }" - value="str:${value%% *}" - json_type=string - ;; - [+-.0-9]*) - value="$(json_number)" || return 1 - json_document="${value#* }" - value="${value%% *}" - json_type=number - ;; - "{"*) - value="$(json_object)" || return 1 - json_document="${value#* }" - value="obj:${value%% *}" - json_type=object - ;; - "["*) - value="$(json_array)" || return 1 - json_document="${value#* }" - value="arr:${value%% *}" - json_type=array - ;; - null*) - json_document="${json_document#null}" - value="null" - json_type=null - ;; - true*) - json_document="${json_document#true}" - value="true" - json_type=boolean - ;; - false*) - json_document="${json_document#false}" - value="false" - json_type=boolean - ;; - esac - - printf "%s %s\n" "$value" "$json_document" + printf '%s %s\n' "${number%.000000}" "$json_document" } json_array() { @@ -239,14 +189,64 @@ json_object() { printf "%s %s\n" "$(STRING "$struct")" "$json_document" } +json_value() { + local value json_document="$json_document" + json_type="" + + json_space + case $json_document in + \"*) + value="$(json_string)" || return 1 + json_document="${value#* }" + value="str:${value%% *}" + json_type=string + ;; + [+-.0-9]*) + value="$(json_number)" || return 1 + json_document="${value#* }" + value="num:${value%% *}" + json_type=number + ;; + "{"*) + value="$(json_object)" || return 1 + json_document="${value#* }" + value="obj:${value%% *}" + json_type=object + ;; + "["*) + value="$(json_array)" || return 1 + json_document="${value#* }" + value="arr:${value%% *}" + json_type=array + ;; + null*) + json_document="${json_document#null}" + value="null" + json_type=null + ;; + true*) + json_document="${json_document#true}" + value="true" + json_type=boolean + ;; + false*) + json_document="${json_document#false}" + value="false" + json_type=boolean + ;; + esac + + printf "%s %s\n" "$value" "$json_document" +} + json_load() { - local json_document="$1" + local json_document="$1" json - json_value + json_value |UNSTRING } json_get() { - local json="$1" jpath="${2#.}" id idx + local json="$1" jpath="${2#.}" key idx json_type='' case $json in @@ -258,11 +258,10 @@ json_get() { json_type="boolean";; null) json_type="null";; esac - json="${json#???:}" case $jpath in "") - printf %s\\n "$json" + printf %s\\n "${json#???:}" return 0 ;; "["[0-9]*"]"*) @@ -270,28 +269,32 @@ json_get() { jpath="${jpath#"["*"]"}" ;; "['"*"']"*) - id="${jpath%%"']"*}" id="${id#"['"}" + key="${jpath%%"']"*}" key="${key#"['"}" jpath="${jpath#"['"*"']"}" ;; - *) id="${jpath%%[".["]*}" - jpath="${jpath#"$id"}" + "$"*) + jpath="${jpath#?}" + ;; + *) key="${jpath%%[".["]*}" + jpath="${jpath#"$key"}" ;; esac - if [ "$id" -a "$json_type" = object ]; then - # if ! json="$(DB2 "$(UNSTRING "$json")" get "$id")"; then - if ! json="$(DB2 "$json" get "$id")"; then - debug "No key: \"$id\"" + if [ "$key" -a "$json_type" = object ]; then + if ! json="$(DB2 "${json#obj:}" get "$key")"; then + debug "Key not found: \"$key\"" return 1 fi elif [ "$idx" -a "$json_type" = array ]; then - if ! json="$(DB2 "$(UNSTRING "$json")" get @ "$(( idx + 1 ))")"; then - # if ! json="$(DB2 "$json" get @ "$(( idx + 1 ))")"; then - debug "No array index: \"$idx\"" + if ! json="$(DB2 "${json#arr:}" get @ "$(( idx + 1 ))")"; then + debug "Array index not found: \"$idx\"" return 1 fi - else - debug "Value type missmatch" + elif [ "$key" ]; then + debug "Cannot select key (\"$key\") from value of type \"$json_type\"" + return 1 + elif [ "$idx" ]; then + debug "Cannot select index ($idx) from value of type \"$json_type\"" return 1 fi json_get "$json" "$jpath"