La conversion JSON vers Go transforme des données JSON brutes en définitions de types Go compatibles avec le package encoding/json de la bibliothèque standard. Go est un langage statiquement typé, ce qui signifie que chaque champ JSON doit avoir un champ de struct correspondant avec le type correct et une struct tag qui indique au sérialiseur quelle clé JSON mapper. Écrire ces définitions à la main pour des réponses d'API volumineuses ou profondément imbriquées est lent et source d'erreurs.
Le package encoding/json, disponible depuis Go 1.0, utilise la réflexion pour faire correspondre les clés JSON aux champs exportés des structs. La correspondance est insensible à la casse par défaut, mais les json struct tags explicites sont la pratique standard : elles suppriment l'ambiguïté et permettent d'utiliser la convention PascalCase de Go pendant que le JSON reste en camelCase ou snake_case. Un convertisseur automatise tout cela : il lit votre JSON, infère les types Go à partir des valeurs et produit les définitions de structs avec les tags corrects.
Le système de types de Go s'adapte naturellement à JSON. Les chaînes deviennent string, les booléens bool, les entiers int et les nombres à virgule flottante float64. Les objets JSON imbriqués deviennent des structs nommés distincts, et les tableaux deviennent des slices. Le seul cas particulier est null : Go n'a pas de type nullable universel, donc les valeurs null deviennent généralement des types pointeur (*string, *int) ou interface{}. Un générateur gère tout cela en quelques millisecondes.
Pourquoi utiliser un convertisseur JSON vers Go ?
Définir des structs Go à partir de JSON à la main signifie compter les accolades, deviner les types et réécrire les tags à chaque modification d'API. Un convertisseur élimine cette friction.
⚡
Génération de types instantanée
Collez votre JSON et obtenez des définitions de structs Go correctes en moins d'une seconde. Pas de saisie manuelle des champs, pas de tags oubliés, pas de problèmes d'alignement.
🔒
Traitement axé sur la confidentialité
La conversion s'effectue entièrement dans votre navigateur. Votre JSON ne quitte jamais votre machine. Les clés API, tokens et données utilisateur restent privés.
🏷️
Struct tags corrects
Chaque champ généré inclut une json struct tag qui fait correspondre le nom du champ Go à la clé JSON d'origine. Cela empêche les incohérences silencieuses lors de json.Unmarshal.
📦
Sans installation ni inscription
Ouvrez la page et collez votre JSON. Aucune toolchain Go requise, aucun outil CLI à installer, aucun compte à créer.
Cas d'utilisation JSON vers Go
Développement de clients REST API
Générez des structs de requête et de réponse pour des API REST tierces. Collez un exemple de JSON issu de la documentation de l'API et obtenez des types prêts à l'emploi avec http.Client et json.NewDecoder.
Modèles gRPC Gateway
Lorsqu'un service Go expose à la fois des endpoints gRPC et REST, vous avez besoin de structs Go correspondant aux payloads JSON. Convertissez la forme JSON en structs qui correspondent à vos définitions protobuf.
Analyse de configurations DevOps
Analysez des fichiers de configuration JSON (sorties Terraform, manifests Kubernetes, configs de pipeline CI/CD) en structs Go typés pour des outils personnalisés et des scripts d'automatisation.
Traitement de pipelines de données
Construisez des structs Go pour des enregistrements JSON provenant de files de messages (Kafka, RabbitMQ, SQS) ou de data lakes. Les structs typés détectent les changements de schéma à la compilation plutôt qu'à l'exécution.
Préparation de fixtures de tests
Convertissez des fixtures JSON de test en structs Go pour des tests pilotés par tableau. Les fixtures type-safe facilitent le diagnostic des échecs de tests par rapport à des assertions brutes sur map[string]interface{}.
Apprentissage du système de types de Go
Les étudiants et développeurs venant de langages dynamiques peuvent coller du JSON familier et voir comment Go représente les mêmes données avec des types explicites, des pointeurs et des struct tags.
Correspondance des types JSON vers Go
Le package encoding/json suit des règles précises pour mapper les valeurs JSON aux types Go. Le tableau ci-dessous montre la correspondance par défaut et les alternatives courantes. La colonne « Défaut » correspond à ce que la plupart des générateurs produisent. La colonne « Alternative » montre les types que vous pourriez choisir selon vos besoins, comme int64 pour les grands identifiants ou les types pointeur pour les champs nullables.
Type JSON
Exemple
Défaut
Alternative
string
"hello"
string
string
number (integer)
42
int
int64
number (float)
3.14
float64
float64
boolean
true
bool
bool
null
null
interface{}
*string / *int
object
{"k": "v"}
struct
struct
array of strings
["a", "b"]
[]string
[]string
array of objects
[{"id": 1}]
[]Item
[]Item
mixed array
[1, "a"]
[]interface{}
[]interface{}
Référence des struct tags JSON en Go
Les struct tags contrôlent la façon dont encoding/json sérialise et désérialise les champs. La tag json est de loin la plus courante, mais vous pouvez la combiner avec d'autres tags (db, yaml, xml) sur le même champ. La syntaxe des tags est une chaîne délimitée par des backticks après le type du champ. Voici les options de la tag json supportées par encoding/json.
Tag
Comportement
Cas d'utilisation
json:"name"
Maps struct field to JSON key "name"
Always generated
json:"name,omitempty"
Omits field from output if zero value
Optional fields
json:"-"
Field is never serialized or deserialized
Internal fields
json:"name,string"
Encodes int/bool as JSON string
String-encoded numbers
json.Unmarshal vs json.NewDecoder
Go propose deux façons de décoder du JSON : json.Unmarshal pour les slices d'octets et json.NewDecoder pour les flux io.Reader. Les deux utilisent les mêmes règles de struct tags, mais diffèrent selon le contexte d'utilisation.
json.Unmarshal
Prend un []byte et remplit un struct. Idéal pour le JSON déjà entièrement en mémoire : corps de réponses HTTP lus avec io.ReadAll, contenus de fichiers ou fixtures de tests. Retourne une erreur si le JSON est malformé ou si les types ne correspondent pas.
json.NewDecoder
Encapsule un io.Reader et décode les tokens JSON au fil de leur arrivée. Idéal pour les sources en streaming : corps de réponses HTTP lus directement, journaux JSON délimités par des sauts de ligne (NDJSON), ou fichiers volumineux que vous ne souhaitez pas charger entièrement en mémoire. Appelez Decode() dans une boucle avec More() pour les flux multi-objets.
Exemples de code
Ces exemples montrent comment utiliser des structs Go générés depuis JSON dans de vrais programmes, ainsi que comment les générer depuis d'autres langages. Les exemples Go utilisent encoding/json de la bibliothèque standard.
Go (json.Unmarshal)
package main
import (
"encoding/json"
"fmt"
)
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
IsActive bool `json:"is_active"`
Tags []string `json:"tags"`
}
func main() {
data := []byte(`{"id":1,"name":"Alice","email":"alice@example.com","is_active":true,"tags":["admin","editor"]}`)
var user User
if err := json.Unmarshal(data, &user); err != nil {
panic(err)
}
fmt.Println(user.Name) // → Alice
fmt.Println(user.Tags) // → [admin editor]
}
JavaScript (fetch + type reference)
// JSON response from API — this is the shape you'd convert to Go:
const res = await fetch("https://api.example.com/users/1");
const user = await res.json();
// user → { "id": 1, "name": "Alice", "email": "alice@example.com" }
// Equivalent Go struct:
// type User struct {
// ID int `json:"id"`
// Name string `json:"name"`
// Email string `json:"email"`
// }
Python (generate Go structs from JSON)
import json
def json_to_go(data: dict, name: str = "Root") -> str:
lines = [f"type {name} struct {{"]
type_map = {str: "string", int: "int", float: "float64", bool: "bool"}
for key, value in data.items():
go_type = type_map.get(type(value), "interface{}")
field = key.title().replace("_", "") # snake_case → PascalCase
lines.append(f'\t{field} {go_type} `json:"{key}"`')
lines.append("}")
return "\n".join(lines)
data = json.loads('{"user_name": "Alice", "age": 30, "verified": true}')
print(json_to_go(data))
# type Root struct {
# UserName string `json:"user_name"`
# Age int `json:"age"`
# Verified bool `json:"verified"`
# }
Go (json.Decoder for streams)
package main
import (
"encoding/json"
"fmt"
"strings"
)
type Event struct {
Type string `json:"type"`
Payload string `json:"payload"`
}
func main() {
stream := strings.NewReader(`{"type":"click","payload":"btn-1"}
{"type":"scroll","payload":"page-2"}`)
dec := json.NewDecoder(stream)
for dec.More() {
var ev Event
if err := dec.Decode(&ev); err != nil {
break
}
fmt.Printf("%s: %s\n", ev.Type, ev.Payload)
}
// → click: btn-1
// → scroll: page-2
}
Questions fréquentes
Quelle est la différence entre json.Unmarshal et json.Decode ?
json.Unmarshal prend un []byte contenant le document JSON complet et remplit un struct. json.NewDecoder encapsule un io.Reader et décode le JSON de façon incrémentale. Utilisez Unmarshal lorsque vous avez déjà le JSON complet en mémoire (par exemple après io.ReadAll). Utilisez NewDecoder pour lire directement depuis un corps de réponse HTTP, un fichier ou toute source en streaming où vous souhaitez éviter de mettre tout le payload en mémoire tampon.
Comment Go gère-t-il les champs JSON absents du payload ?
Les champs JSON absents laissent le champ de struct Go correspondant à sa valeur zéro : "" pour les chaînes, 0 pour les nombres, false pour les booléens, nil pour les pointeurs et les slices. Si vous devez distinguer « champ absent » de « champ présent mais à zéro », utilisez un type pointeur comme *int ou *string. Un pointeur nil signifie que le champ était absent ; un pointeur non-nil avec une valeur zéro signifie qu'il a été explicitement défini à 0 ou "".
Pourquoi les champs de struct Go doivent-ils être exportés (avec majuscule) pour JSON ?
Le package encoding/json utilise la réflexion pour accéder aux champs des structs, et les règles de réflexion de Go n'autorisent l'accès qu'aux champs exportés (commençant par une majuscule). Si un champ commence par une minuscule, encoding/json ne peut pas le voir et l'ignorera silencieusement lors du marshaling et de l'unmarshaling. Utilisez la json struct tag pour faire correspondre un champ exporté en PascalCase à une clé JSON en minuscules.
Comment gérer les clés JSON en snake_case dans Go ?
Ajoutez une json struct tag avec le nom exact de la clé JSON. Par exemple, un champ JSON "user_name" correspond à un champ Go UserName avec la tag `json:"user_name"`. Le générateur gère cela automatiquement. Il n'existe pas d'option globale dans encoding/json pour définir une politique de nommage ; chaque champ doit déclarer sa propre tag.
Puis-je convertir du JSON avec des valeurs null vers Go ?
Oui. Les valeurs JSON null correspondent à des types pointeur en Go. Un champ comme "age": null devient Age *int `json:"age"`. Lorsque la valeur JSON est null, le pointeur Go est nil. Lorsqu'elle a une valeur, Go alloue un int et le pointeur le référence. Pour les champs toujours nullables, utiliser un pointeur est l'approche idiomatique en Go.
Que se passe-t-il si le JSON contient un nombre trop grand pour le type int de Go ?
Le type int de Go dépend de la plateforme (32 bits sur les systèmes 32 bits, 64 bits sur les systèmes 64 bits). Pour les grands nombres comme les timestamps JavaScript ou les identifiants de base de données, utilisez explicitement int64. Si le nombre JSON a des décimales, utilisez float64. Pour les nombres dépassant la précision de float64 (par exemple, les grandes valeurs financières), utilisez json.Number, qui conserve la représentation sous forme de chaîne brute et vous permet de l'analyser vous-même.
Y a-t-il une différence entre cet outil et JSON-to-Go-Struct ?
Cet outil génère des définitions de types Go en se concentrant sur les patterns d'utilisation de encoding/json : struct tags corrects, inférence de types appropriée et gestion des structures imbriquées et des tableaux. L'outil JSON to Go Struct de ce site se concentre sur l'échafaudage de structs. Les deux produisent du code Go valide. Utilisez celui qui correspond le mieux à votre flux de travail. La référence des struct tags et les tableaux de correspondance des types sur cette page sont utiles quel que soit le générateur choisi.