web-dev-qa-db-fra.com

Analyser le tableau json dans le script shell

j'ai besoin d'imprimer la clé et les valeurs d'une chaîne JSON. J'analyse déjà une chaîne JSON simple

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

mon code comme ça

 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;

Mais ce code ne s'applique pas à la chaîne JSON comme celle-ci

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

J'ai besoin d'imprimer comme ça

test1 , testId1
test2 , testId2

est-il possible d'obtenir des données comme celle-ci en utilisant la commande grep?

5
Abdul Manaf

Premièrement, vos données ne sont pas valides json, il y a trop de virgule:

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

Une fois que vous avez résolu le problème, vous pouvez utiliser jq pour analyser json sur la ligne de commande:

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

si vous devez conserver les valeurs de sortie. 

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

Je vous recommande d'utiliser jq , un analyseur JSON en ligne de commande:

$ 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