Traitement JSON en Go (Golang) : encoding/json, bibliothèques et exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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 :=

Recommendations