it-swarm.com.de

Json-Array in Shell-Skript analysieren

ich muss Schlüssel und Werte aus einer Json-Zeichenfolge drucken. ich parse schon eine einfache json string

            {
              "Name": "test1",
              "CreateDate": "2016-08-30T10:52:52Z",
              "Id": "testId1",
            }

mein Code so

 q1=$(echo $x | grep -Po '"Name":.*?[^\\]",'| Perl -pe 's/"Name": //; s/^"//; s/",$//');

 q2=$(echo $x | grep -Po '"Id":.*?[^\\]",'| Perl -pe 's/"Id": //; s/^"//; s/",$//');

    echo $q1 "," $q2;

Dieser Code gilt jedoch nicht für json-Zeichenfolgen

x='{    "TestNames":
        [{
        "Name": "test1",
        "CreateDate": "2016-08-30T10:52:52Z",
        "Id": "testId1"
         }, 
         {
        "Name":  "test2",
        "CreateDate": "2016-08-30T10:52:13Z",
        "Id": "testId2"
    }]
}';

Ich muss so drucken

test1 , testId1
test2 , testId2

ist es möglich, solche Daten mit dem Befehl grep zu erhalten?

5
Abdul Manaf

Erstens sind Ihre Daten nicht gültig, da ist ein Komma zu viel:

{
  "TestNames": [
    {
      "Name": "test1",
      "CreateDate": "2016-08-30T10:52:52Z",
      "Id": "testId1", <--- Remove that!
    },
    {
      "Name": "test2",
      "CreateDate": "2016-08-30T10:52:13Z",
      "Id": "testId2"
    }
  ]
}

Wenn Sie das Problem behoben haben, können Sie jq zum Analysieren von json in der Befehlszeile verwenden:

echo "$x" | jq -r '.TestNames[]|"\(.Name) , \(.Id)"'

wenn Sie die Ausgabewerte beibehalten müssen. 

declare -A map1

while read name id ; do
    echo "$name"
    echo "$id"
    map1[$name]=$id

done < <(echo "$x" | jq -r '.TestNames[]|"\(.Name) \(.Id)"')

echo "count : ${#map1[@]}"
echo "in loop: ${map1[$name]}"
8
hek2mgl

Ich würde empfehlen, jq , eine Befehlszeile JSON-Parser:

$ echo '''{
          "Name": "test1",
          "CreateDate": "2016-08-30T10:52:52Z",
          "Id": "testId1"
        }''' | jq  '.Name + " , " + .Id'

"test1 , testId1"


$ echo '''{    "TestNames":
    [{
    "Name": "test1",
    "CreateDate": "2016-08-30T10:52:52Z",
    "Id": "testId1"
     },
     {
    "Name":  "test2",
    "CreateDate": "2016-08-30T10:52:13Z",
    "Id": "testId2"
}]
}''' | jq '.TestNames[] | .Name + " , " + .Id'

"test1 , testId1"
"test2 , testId2"
2
Aaron