19/09/2024

PowerShell

PowerShell : comment lire, modifier et créer un fichier JSON ?

I. Présentation

Dans ce tutoriel, nous allons apprendre à manipuler le format de fichiers JSON en PowerShell, à l'aide de trois cmdlets natifs : "ConvertFrom-Json", "ConvertTo-Json" et "Test-Json". Ceci va nous permettre de lire (parser), modifier et créer un fichier au format JSON.

Nous commencerons par quelques mots sur le format JSON en lui-même, avant d'évoquer sa manipulation au travers de PowerShell avec des exemples pratiques.

👉 Si vous désirez apprendre PowerShell, découvrez notre cours :

II. Qu'est-ce que le format JSON ?

Aujourd'hui, le JSON pour JavaScript Object Notation, est l'un des formats de fichiers les plus populaires, notamment pour structurer des données dans de nombreuses applications web et mobiles. Comme son sigle l'indique, il est lié au langage JavaScript, mais cela ne l'empêche pas d'être pris en charge par d'autres langages. En effet, PowerShell est capable de manipuler le format JSON, comme d'autres formats tels que XML et CSV.

Un fichier JSON est représenté par un simple fichier texte ayant l'extension ".json". Son format standard est utile pour représenter des données structurées dans un fichier, notamment parce qu'il va permettre de hiérarchiser les données. Ainsi, un simple éditeur de texte comme le Bloc-notes sur Windows sera suffisant pour lire et modifier un fichier JSON, même si l'on priorisera l'utilisation d'applications plus adaptées comme Visual Studio Code ou Notepad++.

JSON suit un format strict qu'il convient de respecter au moment de créer ou modifier un fichier dans ce format. Les données du fichier sont présentées sous la forme de paires de clé et de valeur. Le nom de la clé doit se trouver entre guillemets, tandis que ce n'est pas obligatoire pour la valeur (tout dépend de son type : chaîne de caractère, nombre, booléen, tableau, etc...).

Par exemple :

"prenom": "Florian"

D'autres caractères sont très utilisés avec le langage JSON et sont au cœur de la syntaxe, notamment les accolades "{}" pour désigner un objet et les crochets "[]" pour désigner un tableau.

Ci-dessous, un fichier nommé "salaries.json" qui contient un objet nommé "salaries" dont la valeur est un tableau avec un ensemble de salariés. Ceci permet de bien visualiser la structure des données, ainsi que la hiérarchisation de celles-ci.

{"salaries":[
	{
		"id": 1,
		"nom": "Burnel",
		"prenom": "Florian",
		"departement": "IT",
		"email": "[email protected]"
	},
	{ 
		"id": 2,
		"nom": "Mauve",
		"prenom": "Guy",
		"departement": "Commercial",
		"email": "[email protected]"
	}
]}

Si vous souhaitez valider la syntaxe d'un code JSON, je vous encourage à utiliser le site "jsonlint.com" qui est un vérificateur en ligne. Visual Studio Code est également capable de mettre en évidence les erreurs de syntaxe, en plus de proposer l'auto-complétion.

Passons à la pratique.

III. Lire un fichier JSON avec PowerShell

Nous allons commencer par apprendre à lire un fichier JSON, en reprenant le code ci-dessous enregistré dans un fichier nommé "salaries.json".

À partir de PowerShell, nous allons pouvoir récupérer le contenu du fichier avec "Get-Content" pour indiquer qu'il s'agit du format JSON grâce au cmdlet "ConvertFrom-Json". Ainsi, nous allons obtenir un objet PowerShell correspondant à la structure de données du fichier JSON.

Mais, avant cela, nous allons utiliser le cmdlet "Test-Json" dont l'objectif est de vous indiquer si la syntaxe JSON est valide ou non. Ce cmdlet renverra un booléen, c'est-à-dire "vrai" ou "faux" en fonction du résultat. Attention, ce cmdlet n'est pas disponible avec Windows PowerShell 5.1 et les versions antérieures.

Get-Content -Path "C:\TEMP\JSON\salaries.json" -Raw | Test-Json

Notre fichier est valide, nous pouvons poursuivre :

Nous allons importer le contenu du fichier "salaries.json" et le stocker dans une variable :

$json = Get-Content -Path "C:\TEMP\JSON\salaries.json" -Raw | ConvertFrom-Json

Désormais, le contenu du fichier JSON est stocké dans la variable "$json". Si une erreur est retournée, c'est probablement que la syntaxe du fichier JSON est incorrecte : dans ce cas, PowerShell vous le fera savoir.

Pour lire le contenu de notre clé "salaries", nous devons l'appeler par son nom, parce qu'elle correspond dorénavant à une propriété de notre objet PowerShell.

$json.salaries

Nous pouvons voir que PowerShell retourne la liste des deux salariés, de façon structurée.

Ceci signifie que nous pouvons manipuler les données, et notamment filtrer les résultats en jouant sur les différentes propriétés : "id", "nom", "prenom", "departement" et "email". L'exemple suivant permet de récupérer la liste de tous les salariés rattachés au département "IT".

$json.salaries | Where-Object { $_.departement -eq "IT" }

Cette fois-ci, un seul résultat est retourné.

Par ailleurs, nous pouvons également récupérer un élément en spécifiant son numéro d'index. Ici, nous récupérons le premier élément du tableau.

$json.salaries[0]

IV. Créer un fichier JSON avec PowerShell

Nous pouvons convertir le résultat de n'importe quelle commande PowerShell dans un fichier JSON grâce au cmdlet "ConvertTo-Json" couplé au pipeline. Une fois les données converties, nous pourrons utiliser le cmdlet "Out-File" pour les exporter dans un fichier de sortie. Ici, c'est le résultat de la commande "Get-Service" qui est exporté au format JSON vers le fichier "C:\TEMP\JSON\services.json".

Get-Service | ConvertTo-Json | Out-File "C:\TEMP\JSON\services.json"

Voici un aperçu du fichier obtenu en sortie :

PowerShell - ConvertTo-Json

Une autre façon de procéder consiste à créer un objet JSON directement dans le script PowerShell, pour ensuite l'exporter dans un fichier de sortie au format JSON.

Voici un exemple stocké dans une variable PowerShell. Il y a plusieurs clés (Utilisateur, SiteWeb, Langue, Role) et un sous-objet (Options).

$data = @{
"Utilisateur" = "fb"
"SiteWeb" = "www.it-connect.fr"
"Options" = @{
"Langue" = "FR"
"Role" = "Auteur"
}
}

Ce code peut être converti en JSON à l'aide de "ConvertTo-Json" puis exporté dans un fichier de sortie. Comme ceci :

$data | ConvertTo-Json | Set-Content -Path C:\TEMP\JSON\powershell.json

Une fois cette commande exécutée, nous obtenons un fichier JSON avec nos données correctement formatées, avec notamment de hiérarchiser nos données.

PowerShell - Variable au format JSON

V. Modifier un fichier JSON avec PowerShell

Pour finir, nous allons apprendre à modifier le contenu d'un fichier JSON à l'aide de PowerShell. Comme point de départ, nous utilisons la variable "$json" correspondante au contenu du fichier "C:\TEMP\JSON\salaries.json". L'objectif est de remplacer l'adresse e-mail "[email protected]" par "[email protected]" pour l'utilisateur dont le nom est "Burnel".

La première étape consiste à récupérer l'élément du tableau correspondant, donc nous effectuons un filtre sur le nom. Le résultat est stocké dans la variable "$jsonUser". Ce qui donne :

$jsonUser = $json.salaries | Where-Object { $_.nom -eq "Burnel" }

L'image suivante montre bien que la variable "$jsonUser" contient notre utilisateur.

Désormais, nous allons modifier la valeur de la clé "email" simplement en lui affectant une nouvelle valeur :

$jsonUser.email = "[email protected]"

Puis, nous pouvons consulter une nouvelle fois la variable "$jsonUser" pour voir que la modification a été prise en compte :

$jsonUser

L'image suivante illustre ce changement.

Pour le moment, cette modification est visible uniquement dans la session PowerShell actuelle. Le fichier JSON source quant à lui, n'a pas été modifié. Pour modifier le fichier JSON, nous allons utiliser le cmdlet "ConvertTo-Json" ainsi que "Set-Content" pour modifier le fichier. Ainsi, nous allons écraser le contenu du fichier "salaries.json" avec le contenu de la variable "$json".

$json | ConvertTo-Json | Set-Content "C:\TEMP\JSON\salaries.json"

Voilà, le contenu du fichier JSON a été modifié !

Remarque : le cmdlet "ConvertTo-Json" dispose d'un paramètre nommé "-Depth" qui sert à spécifier combien de niveaux d'objets sont inclus dans les données JSON, c'est-à-dire le nombre d'imbrications. Par défaut, la valeur est "2" donc il pourra être utile d'indiquer une valeur supérieure dans certains cas. La valeur doit être comprise entre 1 et 100.

VI. Conclusion

Suite à la lecture de ce tutoriel, vous devriez être capable de manipuler le format JSON avec PowerShell, notamment avec les cmdlets "ConvertTo-Json" et "ConvertFrom-Json", intégré nativement à Windows PowerShell et PowerShell.

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.