83 votes

PowerShell : récupérer un objet JSON par valeur de champ

Considérez JSON dans ce format :

"Stuffs": [
    {
        "Name": "Darts",
        "Type": "Fun Stuff"
    },
    {
        "Name": "Clean Toilet",
        "Type": "Boring Stuff"
    }
]

Dans PowerShell 3, nous pouvons obtenir une liste de Stuffs :

$JSON = Get-Content $jsonConfigFile | Out-String | ConvertFrom-Json

En supposant que nous ne connaissions pas le contenu exact de la liste, y compris l'ordre des objets, comment pouvons-nous récupérer le(s) objet(s) ayant une valeur spécifique pour le champ Nom ?

Par la force brute, nous pourrions itérer à travers la liste :

foreach( $Stuff in $JSON.Stuffs ) { 

Mais j'espère qu'il existe un mécanisme plus direct (similaire à Lync ou aux expressions Lambda en C#).

117voto

David Brabant Points 11159
$json = @"
{
"Stuffs": 
    [
        {
            "Name": "Darts",
            "Type": "Fun Stuff"
        },

        {
            "Name": "Clean Toilet",
            "Type": "Boring Stuff"
        }
    ]
}
"@

$x = $json | ConvertFrom-Json

$x.Stuffs[0] # access to Darts
$x.Stuffs[1] # access to Clean Toilet
$darts = $x.Stuffs | where { $_.Name -eq "Darts" } #Darts

40voto

Xero Points 433

Je viens de poser la même question ici : https://stackoverflow.com/a/23062370/3532136 Il s'agit d'une bonne solution. J'espère que cela vous aidera ^^. En résumé, vous pouvez utiliser ceci :

Dans mon cas, le fichier Json s'appelait jsonfile.json :

{
    "CARD_MODEL_TITLE": "OWNER'S MANUAL",
    "CARD_MODEL_SUBTITLE": "Configure your download",
    "CARD_MODEL_SELECT": "Select Model",
    "CARD_LANG_TITLE": "Select Language",
    "CARD_LANG_DEVICE_LANG": "Your device",
    "CARD_YEAR_TITLE": "Select Model Year",
    "CARD_YEAR_LATEST": "(Latest)",
    "STEPS_MODEL": "Model",
    "STEPS_LANGUAGE": "Language",
    "STEPS_YEAR": "Model Year",
    "BUTTON_BACK": "Back",
    "BUTTON_NEXT": "Next",
    "BUTTON_CLOSE": "Close"
}

Código:

$json = (Get-Content "jsonfile.json" -Raw) | ConvertFrom-Json

$json.psobject.properties.name

Sortie :

CARD_MODEL_TITLE
CARD_MODEL_SUBTITLE
CARD_MODEL_SELECT
CARD_LANG_TITLE
CARD_LANG_DEVICE_LANG
CARD_YEAR_TITLE
CARD_YEAR_LATEST
STEPS_MODEL
STEPS_LANGUAGE
STEPS_YEAR
BUTTON_BACK
BUTTON_NEXT
BUTTON_CLOSE

Merci à mjolinor .

23voto

Grant Letourneau Points 239

La réponse de David Brabant m'a conduit à ce dont j'avais besoin, avec cet ajout :

x.Stuffs | where { $_.Name -eq "Darts" } | Select -ExpandProperty Type

6voto

andrew pate Points 54

Que diriez-vous de ceci ?

$json=Get-Content -Raw -Path 'my.json' | Out-String | ConvertFrom-Json
$foo="TheVariableYourUsingToSelectSomething"
$json.SomePathYouKnow.psobject.properties.Where({$_.name -eq $foo}).value

qui sélectionnerait dans un fichier json structuré

{"SomePathYouKnow":{"TheVariableYourUsingToSelectSomething": "Tada!"}

Ceci est basé sur ce qui suit accès aux valeurs dans powershell question SO . N'est-ce pas fabuleux, powershell !

3voto

Vopel Points 81

En ce qui concerne PowerShell 5.1 (c'est tellement plus facile avec PowerShell 7)...

En partant du principe que nous avons un fichier nommé jsonConfigFile.json avec le contenu suivant de votre article :

{
    "Stuffs": [
        {
            "Name": "Darts",
            "Type": "Fun Stuff"
        },
        {
            "Name": "Clean Toilet",
            "Type": "Boring Stuff"
        }
    ]
}

Cette opération permet de créer une table de hachage ordonnée à partir d'un fichier JSON afin de faciliter la recherche :

$json = [ordered]@{}

(Get-Content "jsonConfigFile.json" -Raw | ConvertFrom-Json).PSObject.Properties |
    ForEach-Object { $json[$_.Name] = $_.Value }

$json.Stuffs va afficher une belle table de hachage, mais les choses se compliquent un peu à partir de là. Disons que vous voulez la Type associée à la valeur de la clé Clean Toilet vous la récupérerez comme suit :

$json.Stuffs.Where({$_.Name -eq "Clean Toilet"}).Type

C'est une véritable plaie, mais si votre objectif est d'utiliser JSON sur une installation Windows 10 dépouillée, c'est la meilleure façon de le faire, d'après ce que j'ai trouvé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X