....so oder ähnlich könnte es nun heissen.
Das Problem war eigentlich, nur "mal eben" einen JSON-String ohne zusätzliche Tools "menschlich lesbar" anzuzeigen.
"Da muss doch schon mal wer was ordentliches gemacht haben?"
Nach ca. 2 Stunden suchen hatte ich jedoch immer noch nichts wirklich funktionierendes gefunden, was einen JSON-String "ordentlich" menschlich visualisiert -
oder auch ggf. aus einem JSON-String einen Variablen-Bereich einfach wieder heraus gibt.
Na dann... bau ich da mal halt selbst -
Auf geht's :-)
#!/bin/bash
#
# Funktionen zum Umgang mit JSON-Strings.
#
# 2020-11-13 Oliver Lenz Initial
#
function parse_jsonvar_raw() {
# Parse einen JSON-String in menschlich lesbare form.
#
# $1 JSON-String
# $2 Tabulatorenweite (default:4) (optional)
# $3 Filtere die Ausgabe anhand eines Variablennamens (optional), z.B. "value.name"
#
local buchstabe="" letzter_buchstabe="" zeile=""
local in_gaensefuesschen=0 umbruch=""
local variablenname="" variablenstack=()
local ebene=0 anschlag=0
local tabbreite=4 filter="" zurueck=0
if [ $# -gt 1 ]; then
[[ "${2}" =~ (^[0-9]*$) ]] && tabbreite=$2 || filter=".${2}"
fi
[ $# -gt 2 ] && filter=".${3}"
function vartest() {
local voller_variablenname="" i=0 s
[ -n "${variablenname}" ] && variablennamenstack[${ebene}]="${variablenname}"
voller_variablenname=""
for((i=0;i<=${ebene};i++)){
s="${variablennamenstack[$i]#\"}"
s="${s%\"}"
voller_variablenname="${voller_variablenname}.${s}"
} # printf "%-60s" "${voller_variablenname}"
if [[ -z "${filter}" || "${filter}" == "${voller_variablenname}" || "${voller_variablenname:0:$((${#filter}+1))}" == "${filter}." ]]; then
[ "${filter}" == "${voller_variablenname}" ] && zurueck=$ebene # korrektur bei Filter
(( i=$anschlag-$zurueck*tabbreite ))
[ ${i} -gt 0 ] && printf "%${i}s" " "
[ -n "${zeile}" ] && echo "${zeile}"
fi
variablenname=""
zeile=""
}
while read -n1 buchstabe; do
if [ "${in_gaensefuesschen}" == "1" ]; then
[ "${letzter_buchstabe}" != "\\" ] && [ "${buchstabe}" == "\"" ] && in_gaensefuesschen="0"
elif [ "${letzter_buchstabe}" != "\\" ] && [ "${buchstabe}" == "\"" ]; then
in_gaensefuesschen="1"
else
case "${buchstabe}" in
'{' | '[' | '(' | ',' ) umbruch="nach_buchstaben";;
'}' | ']' | ')' ) umbruch="vor_buchstaben";;
':') variablenname="${zeile}";;
' ') buchstabe="";;
esac
fi
[ "${umbruch}" == "vor_buchstaben" ] && vartest && (( ebene-- ))
zeile="${zeile}${buchstabe}"
[ "${umbruch}" == "vor_buchstaben" ] && (( anschlag=ebene*tabbreite ))
if [ "${umbruch}" == "nach_buchstaben" ]; then
vartest
[ "${buchstabe}" != "," ] && (( ebene++ ))
(( anschlag=ebene*tabbreite ))
fi
letzer_buchstabe="${buchstabe}"
umbruch=""
done<<<"${1}"
[ -n "${zeile}" ] && vartest
}
function parse_jsonvar(){
ausgabe="$( parse_jsonvar_raw "${1}" "${2}" "${3}" )"
[ -n "${ausgabe}" ] && echo "${ausgabe%,}"
}
# json_str='value:{"name":"Hello World","myNumArray":{"index0":"Hello","varname":"value","some":"thing"}}'
# parse_jsonvar "${json_str}"
# parse_jsonvar "${json_str}" 8
# parse_jsonvar "${json_str}" 4 "value"
# parse_jsonvar "${json_str}" 4 "value.name"
# parse_jsonvar "${json_str}" 4 "value.myNumArray"
Geht doch... :-)