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?
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]}"
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"