Introduction au travail avec JSON en Go
JSON (JavaScript Object Notation) est un format léger d'échange de données largement utilisé dans le développement web, les API et les fichiers de configuration. Le langage Go (Golang) fournit le package intégré encoding/json, qui permet d'effectuer facilement l'analyse (décodage) et la sérialisation (encodage) des données. Dans cet article, nous aborderons les bases du travail avec JSON en Go à l'aide d'exemples pratiques, compréhensibles même pour les développeurs débutants.
Fondamentaux du package encoding/json
Le package encoding/json est une bibliothèque standard de Go qui ne nécessite aucune installation supplémentaire. Les deux principaux outils de ce package sont les fonctions json.Marshal (sérialisation) et json.Unmarshal (désérialisation).
Structures et tags JSON
En Go, les données sont généralement représentées sous forme de structures (struct). Les tags sont utilisés pour gérer les noms des champs en JSON. Voici un exemple simple :
package main
import ( "encoding/json" "fmt")
// Définition d'une structure avec des tags JSONtype Person struct { Name string `json:"name"` Age int `json:"age"` Email string `json:"email,omitempty"` IsAdmin bool `json:"is_admin"`}
func main() { // Création d'une instance de la structure person := Person{ Name: "Ivan Petrov", Age: 30, Email: "ivan@example.com", IsAdmin: true, } // Sérialisation en JSON jsonData, _ := json.Marshal(person) fmt.Println(string(jsonData))}Résultat de l'exécution :
{"name":"Ivan Petrov","age":30,"email":"ivan@example.com","is_admin":true}Points importants :
- Le tag
json:"name"indique comment le champ sera nommé en JSON - L'option
omitemptyignore les champs vides (valeurs nulles) - Les champs de la structure doivent être exportables (commencer par une majuscule)
Sérialisation (Marshal) des données en JSON
La sérialisation est le processus de conversion d'une structure Go ou d'un autre type de données en une chaîne JSON. La fonction json.Marshal retourne un slice d'octets ([]byte) et une erreur.
Exemples de sérialisation de différents types
package main
import ( "encoding/json" "fmt")
type Product struct { ID int `json:"id"` Name string `json:"name"` Price float64 `json:"price"` Tags []string `json:"tags,omitempty"` InStock bool `json:"in_stock"`}
func main() { // Sérialisation d'une structure product := Product{ ID: 101, Name: "Ordinateur portable", Price: 79999.99, Tags: []string{"électronique", "ordinateurs portables"}, InStock: true, } // Affichage formaté avec indentation jsonData, _ := json.MarshalIndent(product, "", " ") fmt.Println(string(jsonData)) // Sérialisation d'un slice de structures products := []Product{ {ID: 1, Name: "Souris", Price: 1500.00, InStock: true}, {ID: 2, Name: "Clavier", Price: 3500.00, InStock: false}, } jsonArray, _ := json.Marshal(products) fmt.Println(string(jsonArray))}Résultat :
{ "id": 101, "name": "Ordinateur portable", "price": 79999.99, "tags": [ "électronique", "ordinateurs portables" ], "in_stock": true}[{"id":1,"name":"Souris","price":1500,"in_stock":true},{"id":2,"name":"Clavier","price":3500,"in_stock":false}]Analyse (Unmarshal) JSON en Go
L'analyse est le processus inverse : conversion d'une chaîne JSON en une structure Go. Pour cela, on utilise la fonction json.Unmarshal.
Exemple de base d'analyse
package main
import ( "encoding/json" "fmt" "log")
type User struct { Username string `json:"username"` Age