summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortv <tv@also>2011-07-31 04:23:36 +0200
committertv <tv@also>2011-07-31 04:23:36 +0200
commit991ec1c91e4bde50b41b06765ffdb045bc21710b (patch)
tree3220c9311a77b30ead8c7606454c1a0e1bbcd370
parenta88775480f3500bc3e12d9263ef47ca953c76189 (diff)
parent38bc33d7b4750540afcd67a37cfb00da3357b053 (diff)
Merge /home/tv/sh-json
-rwxr-xr-xjson.sh116
-rw-r--r--test.json6
2 files changed, 122 insertions, 0 deletions
diff --git a/json.sh b/json.sh
new file mode 100755
index 00000000..8297a853
--- /dev/null
+++ b/json.sh
@@ -0,0 +1,116 @@
+#! /bin/sh
+set -euf
+
+# TODO check json first
+
+# XXX json_key is something like PWD^^
+
+normalize_json() {
+ sed -rn '
+ 1s/^/cat<<EOF\n/
+ # TODO handle escaped double quotes
+ s/"[^"]+"/"$(echo -n & | base64)"/g
+ $s/$/\nEOF/
+ p
+ ' | sh | tr -d '[:space:]'
+}
+
+json_to_sh() {
+ sed -rn '
+ s/,/;/g
+ s/\[/begin_json_array;/g; s/\]/end_json_array;/g
+ s/\{/begin_json_object;/g; s/\}/end_json_object;/g
+ s/("[^"]+"):/json_set_key \1;/g
+ s/;("[^"]+")/;json_set string \1;/g
+ s/;([0-9]+)/;json_set number `echo -n \1 | base64`;/g
+ s/;;/;/g
+ s/;/\n/g
+ p
+ '
+}
+
+begin_json_object() {
+ push_key %%%MAKEJSONOBJ%%%
+}
+end_json_object() {
+ #echo end_json_object: $json_key >&2
+ pop_key # TODO check if is %%%MAKEJSONOBJ%%%
+ #echo obj: $1 `set | sed -rn "s/^(${json_key}_[a-zA-Z]+)_VALUE=(.*)/\1/p"` >&2
+ #json_set object "`set | sed -rn "s/^(${json_key}_[a-zA-Z]+)_VALUE=(.*)/\1/p"`"
+ json_set object "`set | sed -rn "s/^(${json_key}_[a-zA-Z]+)=(.*)/\1/p"`"
+}
+begin_json_array() { :; }
+end_json_array() { :; }
+json_push_key() {
+ push_key "`echo -n "$1" | base64 -d`"
+}
+json_set_key() {
+ pop_key
+ json_push_key "$1"
+}
+json_set() {
+ ##echo "typeof_$json_key=$1" >&2
+ ##echo "${json_key}_VALUE=\"$2\"" >&2 # (`echo -n $2 | base64 -d`)" >&2
+ #eval "${json_key}_TYPE=$1"
+ #eval "${json_key}_VALUE=\"$2\""
+ eval "typeof_${json_key}=$1"
+ eval "${json_key}=\"$2\""
+}
+
+push_key() {
+ json_key="${json_key+${json_key}_}$1"
+}
+pop_key() {
+ json_key="`echo $json_key | sed 's/_[^_]\+$//'`"
+}
+
+json() {
+ #eval echo "\"\$`echo -n "$json_key" "$@" | tr "$IFS" _`\" | base64 -d"
+ NAME="`echo -n "$json_key" "$@" | tr "$IFS" _`"
+ #eval "TYPE=\"\$${NAME}_TYPE\""
+ eval "TYPE=\"\$typeof_$NAME\""
+
+ echo -n "$TYPE $NAME: "
+ case "$TYPE" in
+ (object)
+ #eval echo -n \$${NAME}_VALUE
+ eval echo -n \$$NAME
+ ;;
+ #set | sed -rn "s/^(${NAME})_([a-zA-Z]+)[a-zA-Z_]*_VALUE=(.*)/\1_\2/p" |
+ # sort | uniq | tr \\n \ ;;
+ (*) #echo -n "$VALUE";;
+ #eval "VALUE=\"\$(echo -n \"\$${NAME}_VALUE\" | base64 -d)\""
+ #eval echo -n \"\$${NAME}_VALUE\" | base64 -d
+ eval echo -n \$${NAME} | base64 -d
+ esac
+ echo
+}
+
+read_json() {
+ json_key="${1-JSON}"
+ #meh="`cat`"
+ #echo "$meh"
+ ##echo "$meh" | normalize_json | json_to_sh; exit
+ #eval "`echo "$meh" | normalize_json | json_to_sh`"
+ eval "`normalize_json | json_to_sh`"
+}
+
+# TODO print_json x, print_json x ca ... to print as json
+
+read_json x
+echo ====
+set | egrep "^(typeof_)?$json_key[A-Za-z_]*="
+echo ====
+json
+json a
+json b
+json c
+json c ca
+json c cb
+json d
+#echo ====
+#echo $JSON_VALUE
+#echo $JSON_c_cb_VALUE | base64 -d; echo
+
+echo READY.
+#### End of file.
diff --git a/test.json b/test.json
new file mode 100644
index 00000000..a0406039
--- /dev/null
+++ b/test.json
@@ -0,0 +1,6 @@
+{
+ "a": "1",
+ "b": 2,
+ "c": { "ca": 11, "cb": [1, 2, 3, "42"] },
+ "d": {}
+}