BITFOX® | LÖSUNGEN | SERVICE | LOGIN | BLOG | KONTAKT

Sonntag, 15. November 2020

BASH und JSON-Strings
Ein Erfahrungsbericht...

 ....so oder ähnlich könnte es nun heissen.
Das Problem war eigentlich, nur "mal eben" einen JSON-String "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... :-)

Keine Kommentare:

Aktuelles