basic json parser in pure bash
This commit is contained in:
parent
d1c32d32c6
commit
e687cd8dfb
77
gaboshlib/g_json.sh
Normal file
77
gaboshlib/g_json.sh
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# thanks to dylanaraps - https://github.com/dylanaraps/nosj
|
||||||
|
|
||||||
|
# function g_json gives back the associative array $g_json
|
||||||
|
# parsed json by stdin or file in $1
|
||||||
|
#
|
||||||
|
# To get keys use: ${!g_json[@]}
|
||||||
|
# To get values use ${g_json[@]}
|
||||||
|
# To get specifi key use ${g_json[keyname]}
|
||||||
|
|
||||||
|
function g_json {
|
||||||
|
IFS= g_json_tokenize < "${1:-/dev/stdin}"
|
||||||
|
IFS= g_json_parse
|
||||||
|
}
|
||||||
|
|
||||||
|
function g_json_tokenize {
|
||||||
|
local j str
|
||||||
|
while read -rN 1; do
|
||||||
|
case $REPLY in
|
||||||
|
[\{\}\[\],])
|
||||||
|
[[ $str ]] && j+=$REPLY
|
||||||
|
[[ $str ]] || { tokens+=("$j" "$REPLY"); j=; }
|
||||||
|
;;
|
||||||
|
:)
|
||||||
|
[[ $str ]] && j+=:
|
||||||
|
[[ $str ]] || j+='\ '
|
||||||
|
;;
|
||||||
|
[[:space:]])
|
||||||
|
[[ $str ]] && j+=$REPLY
|
||||||
|
;;
|
||||||
|
[\"\'])
|
||||||
|
[[ $str ]] && str= || str=1
|
||||||
|
[[ ${j: -1} == \\ ]] && { str=1; j+=$REPLY; }
|
||||||
|
;;
|
||||||
|
*) j+=$REPLY ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function g_json_parse {
|
||||||
|
local i key key_plain objects o val out
|
||||||
|
declare -Ag g_json
|
||||||
|
for ((i=0;i<${#tokens[@]};i++)) {
|
||||||
|
case ${tokens[i]} in
|
||||||
|
\{|\[)
|
||||||
|
objects+=("${tokens[i-1]}")
|
||||||
|
;;
|
||||||
|
\}|\])
|
||||||
|
unset 'objects[-1]'
|
||||||
|
;;
|
||||||
|
*\\\ *)
|
||||||
|
key=${objects[*]//\\ /.}${tokens[i]/\\ *}
|
||||||
|
key_plain=index_${key//[^A-Za-z0-9]/_}
|
||||||
|
val=${tokens[i]/*\\ }
|
||||||
|
if [[ -n ${g_json[$key]} ]]
|
||||||
|
then
|
||||||
|
[[ -n ${g_json[${key}[0]]} ]] || {
|
||||||
|
g_json["${key}[0]"]=${g_json[$key]}
|
||||||
|
printf -v o 'g_json[%q]=%q' "${key}[0]" "${g_json[$key]}"
|
||||||
|
out+=("$o")
|
||||||
|
}
|
||||||
|
declare -i "$key_plain+=1"
|
||||||
|
printf -v o 'g_json[%q]=%q' "${key}[${!key_plain}]" "$val"
|
||||||
|
out+=("$o")
|
||||||
|
elif [[ $val ]]; then
|
||||||
|
g_json["$key"]=$val
|
||||||
|
printf -v o 'g_json[%q]=%q' "$key" "$val"
|
||||||
|
out+=("$o")
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
g_json /tmp/json
|
||||||
|
|
Loading…
Reference in New Issue
Block a user