+ local cur="$4"
+
+ [ -n "$cur" ] || _json_get_var cur JSON_CUR
+
+ if [ "${cur%%[0-9]*}" = "JSON_ARRAY" ]; then
+ _json_inc "SEQ_$cur" var
+ else
+ local name="${var//[^a-zA-Z0-9_]/_}"
+ [[ "$name" == "$var" ]] || _json_export "NAME_${cur}_${name}" "$var"
+ var="$name"
+ fi
+
+ _json_export "${cur}_$var" "$val"
+ _json_export "TYPE_${cur}_$var" "$type"
+ _jshn_append "JSON_UNSET" "${cur}_$var"
+ _json_add_key "$cur" "$var"
+}
+
+_json_add_table() {
+ local name="$1"
+ local type="$2"
+ local itype="$3"
+ local cur new_cur
+ local seq
+
+ _json_get_var cur JSON_CUR
+ _json_inc JSON_SEQ seq
+
+ local table="JSON_$itype$seq"
+ _json_export "UP_$table" "$cur"
+ _json_export "KEYS_$table" ""
+ [ "$itype" = "ARRAY" ] && _json_export "SEQ_$table" ""
+ _json_stack_push "$table"
+ _jshn_append "JSON_UNSET" "$table"
+
+ _json_get_var new_cur JSON_CUR
+ _json_add_generic "$type" "$1" "$new_cur" "$cur"
+}
+
+_json_close_table() {
+ local stack new_stack
+
+ _json_get_var stack JSON_STACK
+ _json_set_var JSON_CUR "${stack##* }"
+ new_stack="${stack% *}"
+ [[ "$stack" == "$new_stack" ]] && new_stack=
+ _json_set_var JSON_STACK "$new_stack"
+}
+
+json_set_namespace() {
+ local _new="$1"
+ local _old="$2"
+
+ [ -n "$_old" ] && _set_var "$_old" "$JSON_PREFIX"
+ JSON_PREFIX="$_new"
+}
+
+json_cleanup() {
+ local unset