#!/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;
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() {
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
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]*"]"*)
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"