In the meantime, you might want to try this... I'd like to hear from you if it works in general, even if you prefer the perl thingy
#!/bin/bash
header=(); values=(); start=0
while IFS=":" read var val
do
if [[ "$var" = "{" && "$start" = "0" ]]; then # "new" set detected
start=1
continue
elif [[ "$var" = "" ]]; then
echo
continue
elif [[ "$var" = "}" ]]; then # end of a set
printf "%s\n%s\n" "${header[@]}" "${values[@]}"
start=0; header=(); values=()
continue
else # process stuff within a set
var="${var//\"/}"; var="$(echo $var)"
[[ "${#header[@]}" -eq "0" ]] && header=("$var") || header=("${header[@]}","$var")
val="${val# }"; val="${val%,}"
[[ "${#values[@]}" -eq "0" ]] && values=("$val") || values=("${values[@]}","$val")
fi
done <inputfile