0
votes

PowerShell - Recherche d'arbre JSON

J'ai une structure JSON dans un fichier my.json qui semble être similaire à celle ci-dessous: xxx

Utilisation de PowerShell, je souhaite rechercher un "nœud" ke1b et sélectionnez-le. Les hypothèses sont

  1. Key1b ne se produit qu'une fois dans l'arbre entier
  2. Le terme de recherche (Key1b) peut soit être un élément racine ou un enfant d'un élément racine.

    Si je pouvais connaître le parent sous lequel nœud clé1b est que je pourrais utiliser ci-dessous: xxx

    Comment puis-je faire ci-dessus sélectionner générique de sorte que le nœud Je cherche peut être dans la racine ou un enfant de la racine?


4 commentaires

Votre JSON n'est pas syntaxiquement correct, "key1" et "key2" n'a pas de fermeture }


@Nekomusume désolé pour cela, corrigé-le.


Essayez ((get-Content -raw -raw my.json | Convertfrom-json) | GM |? {$ _. Définition -Imatch "Key1a"}). Nom Ceci obtiendra le noeud parent de key1a


A été capable de saisir du contenu de key1a avec votre JSON comme $ testjson comme: $ ($ testjson | Convertfrom-json). $ ((($ (($ Testjson | ConvertFrom-Json) | GM |? {$ _. Définition "Key1a"}). Nom) .Key1a très convulué mais serait plus facile si j'avais une variable distincte avec le JSON converti, la preuve du concept bien que


3 Réponses :



1
votes

Vous pouvez trouver key1a code> ou quelle que soit la clé que vous recherchez en regardant la colonne de définition de Get-Member code>.

Définissons votre JSON comme variable $ Testjson code>: p> xxx pré>

Nous recherchons key1a code> dans $ testjson code> que nous ne savons pas est sous le nœud parent Key1 code>, nous pouvons le faire en examinant la sortie de $ testjson | gm code> p> xxx pré>

Nous pouvons voir ici que tous les nœuds et leurs sous-nœuds sont répertoriés dans l'onglet Définitions, avec des Jsons plus gros, nous ne serions pas capable de voir l'onglet de définitions entière avec ceci afin que nous puissions traiter à l'une de ces deux choses: p> xxx pré>

donc si nous voulons trouver key1a code> nous peut faire p> xxx pré>

qui trouve la définition dans laquelle clé1a code> est (insensible à la casse spécifiée par -i code> de -c code>) qui nous donne la sortie de p> xxx pré>

où, comme vous pouvez le voir, le nœud parent est clé1 code> et Nous pouvons saisir cela aussi avec P>

$($testJson).$(($testJson | gm | ? {$_.Definition -imatch "key1A"}).name).key1a

someKey
-------
someValue


0 commentaires

2
votes
# convert as a Hashtable
$json = Get-Content -Raw .\my.json | ConvertFrom-Json -AsHashtable

# a root element
$json.key1B

# a child of a root element
$json.Values.key1B

# descendant
function findByKey {
  param($json, $key)
  if ($json.$key) { $json.$key }
  else {
    $json.Values | ? values | % { findByKey $_ $key } | select -First 1
  }
}

findByKey $json "key1B"

1 commentaires

La seule chose est que cela nécessite PowerShell 7.