J'ai une sortie JSON qui contient une liste d'objets stockés dans une variable. (Je ne formule peut-être pas ce droit)
[
{
"item1": "value1",
"item2": "value2",
"sub items": [
{
"subitem": "subvalue"
}
]
},
{
"item1": "value1_2",
"item2": "value2_2",
"sub items_2": [
{
"subitem_2": "subvalue_2"
}
]
}
]
J'ai besoin de toutes les valeurs de item2 dans un tableau pour qu'un script bash soit exécuté sur ubuntu 14.04.1.
J'ai trouvé un tas de façons d'obtenir le résultat complet dans un tableau, mais pas seulement les éléments dont j'ai besoin
jq . <<< "$json"
c'est lié à shell (bash), non spécifique àjq
arr=( $(...) )
jq
commande, mais veuillez ne pas analyser la sortie de la commande dans un tableau avecarr=( $(...) )
(même si cela fonctionne avec l'exemple d'entrée): cela ne fonctionne pas comme prévu avec les espaces blancs intégrés ou de début / fin et peut entraîner un globage accidentel.Ce qui suit est en fait un buggy:
Utilisez plutôt:
... ou mieux encore ...
la source
Grâce à sputnick, je suis arrivé à ceci:
Le JSON que j'ai est la sortie d'une API. Tout ce dont j'avais besoin pour faire des wans était de supprimer l'argument file et
|
de diriger la sortie de curl vers jq. Fonctionne très bien et a enregistré quelques étapes.la source
*
- il sera remplacé par une liste de fichiers dans votre répertoire actuel.item2
valeur contenant un espace deviendrait plus d'un élément de tableau.comme alternative simple, regardez l'
jtc
outil (à https://github.com/ldn-softdev/jtc ), pour réaliser la même chose (comme dans l'exemple de jq):explication sur l'
-w
option: les parenthèses angulaires<...>
spécifient la recherche de json entier, le suffixel
indique de rechercher des étiquettes plutôt que des valeurs,+0
indique de trouver toutes les occurrences (plutôt que juste la première).la source
arr=( $(jq ...) )
réponses, dans la mesure où le contenu est divisé en chaînes et étendu par glob pour remplir le tableau - ce qui signifie que les espaces (pas seulement les nouvelles lignes) créent de nouveaux éléments, et les éléments qui ressemblent à une expression de glob sont remplacés par des fichiers qui l'expression correspond.