Traitement JSON en Go (Golang) : de la bibliothèque standard aux outils avancés
JSON (JavaScript Object Notation) est l'un des formats d'échange de données les plus populaires. En Go (Golang), le travail avec JSON est implémenté au plus haut niveau grâce à la puissante bibliothèque standard encoding/json et à de nombreux outils tiers qui accélèrent et simplifient le développement. Dans cet article, nous allons détailler comment sérialiser, désérialiser, valider et optimiser JSON en Go, ainsi que les bibliothèques populaires que tout développeur Go devrait connaître.
Bibliothèque standard encoding/json
encoding/json est un package intégré de Go qui fournit toutes les fonctions nécessaires pour travailler avec JSON. Principales fonctionnalités :
- Marshaling (sérialisation) — conversion de structures Go en chaîne JSON.
- Unmarshaling (désérialisation) — analyse d'une chaîne JSON en structures Go.
- Traitement par flux — lecture/écriture JSON à partir de flux (
io.Reader,io.Writer). - Tags de structure — gestion des noms de champs, omission des valeurs vides, imbrication.
Exemple de marshaling et unmarshaling
package main
import ( "encoding/json" "fmt" "log")
type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` IsActive bool `json:"is_active"`}
func main() { // Marshaling (structure -> JSON) user := User{ID: 1, Name: "Alexeï", Email: "alex@example.com", IsActive: true} jsonData, err := json.Marshal(user) if err != nil { log.Fatal(err) } fmt.Println(string(jsonData)) // Sortie : {"id":1,"name":"Alexeï","email":"alex@example.com","is_active":true}
// Unmarshaling (JSON -> structure) jsonStr := `{"id":2,"name":"Maria","email":"maria@example.com","is_active":false}` var user2 User err = json.Unmarshal([]byte(jsonStr), &user2) if err != nil { log.Fatal(err) } fmt.Printf("%+v", user2) // Sortie : {ID:2 Name:Maria Email:maria@example.com IsActive:false}}Travail avec des données non structurées
Parfois, la structure JSON est inconnue à l'avance. Dans ce cas, vous pouvez utiliser map[string]interface{} ou interface{} :
func main() { jsonStr := `{"name":"Ivan","age":30,"hobbies":["lecture","sport"]}` var data map[string]interface{} err := json.Unmarshal([]byte(jsonStr), &data) if err != nil { log.Fatal(err) } fmt.Println(data["name"]) // Ivan fmt.Println(data["hobbies"].([]interface{})[0]) // lecture}Bibliothèques tierces populaires
Bien que encoding/json couvre la plupart des tâches, pour les systèmes à forte charge ou les scénarios spécifiques, il vaut la peine d'envisager des alternatives :
1. easyjson
easyjson — un générateur de code pour une sérialisation/désérialisation rapide. Il crée des fonctions optimisées pour vos structures, offrant un gain de performance de 2 à 5 fois par rapport à la bibliothèque standard.
- Nécessite la génération de code via
easyjson. - Prend en charge les types personnalisés et l'imbrication.
- Idéal pour les microservices avec un RPS élevé.
//go:generate easyjson -all user.gotype User struct { ID int `json:"id"` Name string `json:"name"`}
// Après génération, utilisez : user.MarshalJSON() / user.UnmarshalJSON()2. gjson
gjson — une bibliothèque pour une lecture rapide de JSON sans désérialisation complète. Permet d'obtenir des valeurs par chemin (analogue à jq) :
import "github.com/tidwall/gjson"
func main() { json := `{"user":{"name":"Olga","age":25}}` name := Aussi dans la bibliothèque
Client OAuth pour Swift (iOS/macOS) : bibliothèque OAuthSwift
Jetons JWT en Kotlin : génération, vérification et utilisation avec io.jsonwebtoken
Client HTTP pour JavaScript (Node.js) : top bibliothèques 2025