Les bases du marshaling et du démarshaling JSON
JSON signifieJavaScriptNotation d'objets, et c'est un moyen très pratique d'échanger des données structurées. Et c'est très populaire, en particulier lors de l'interaction avec les API.
Go a une prise en charge de haut niveau pour JSON dans sa bibliothèque standard, avecleencoding/json
paquet.
Comparé aux langages de typage lâche, le décodage JSON est plus compliqué. En JavaScript, tout ce que vous avez à faire estJSON.parse()
. Python ajson.loads()
, et PHP ajson_decode()
. Ils ne font que vider les valeurs sans problème, mais étant fortement typé Go, vous devez faire un peu plus de travail pour faire correspondre les types.
JSON a 3 types de base:booléens,Nombres,cordes, combiné en utilisanttableauxetobjetspour construire des structures complexes.
Appels de terminologie de Gomaréchalle processus de génération d'une chaîne JSON à partir d'une structure de données, etnon maréchall'acte d'analyser JSON en une structure de données.
Une chaîne JSON
input := `{"firstname": "Bill", "surname": "Gates"}`
Unmarshal JSON
Voici un exemple JSON tiré deMDN de Mozilla
{
"squadName": "Super hero squad",
"homeTown": "Metro City",
"formed": 2016,
"secretBase": "Super tower",
"active": true,
"members": [
{
"name": "Molecule Man",
"age": 29,
"secretIdentity": "Dan Jukes",
"powers": [
"Radiation resistance",
"Turning tiny",
"Radiation blast"
]
},
{
"name": "Madame Uppercut",
"age": 39,
"secretIdentity": "Jane Wilson",
"powers": [
"Million tonne punch",
"Damage resistance",
"Superhuman reflexes"
]
},
{
"name": "Eternal Flame",
"age": 1000000,
"secretIdentity": "Unknown",
"powers": [
"Immortality",
"Heat Immunity",
"Inferno",
"Teleportation",
"Interdimensional travel"
]
}
]
}
Comment pouvons-nous l'analyser dans une structure de données Go? Nous avons besoin d'une structure de données correspondante, bien sûr. Nous avons 5 types de base et un tableau d'objets. Commençons par les types de base:
type squad struct {
SquadName string
HomeTown string
Formed int
SecretBase string
Active bool
}
Nous devons définir le JSON comme un[]byte
, comme ça:
input := []byte(`
{
"squadName": "Super hero squad",
[...]
}
`)
Et nous pouvons démarseler le JSON en une instance d'escouade:
s := squad{}
err := json.Unmarshal(input, &s)
if err != nil {
panic(err)
}
fmt.Printf("%v", s)
Cela imprimera
{Super hero squad Metro City 2016 Super tower true}
Remarquez que nous n'avons aucune erreur se plaignant de la correspondance manquante entre les valeurs JSON et notre structure, elles sont ignorées.
Assurons-nous que json.Unmarshal () nous obtiendra tous les champs, avec:
type squad struct {
SquadName string
HomeTown string
Formed int
SecretBase string
Active bool
Members []Member
}
type Member struct {
Name string
Age int
SecretIdentity string
Powers []string
}
N'oubliez pas d'avoir des propriétés publiques (majuscules) dans vos structures.
Renommer les noms de champs JSON
Dans ce cas, tout allait bien car le JSON avait des noms de fichiers compatibles. Que faire si vous souhaitez mapper le JSON à d'autres champs de votre structure?
Par exemple, que se passe-t-il si le nom du membre est passé commemember_name
, mais vous voulez qu'il soit stocké dansName
au lieu?
Utilisez cette syntaxe:
type Member struct {
Name string `json:"member_name"`
}
Ignorer les champs JSON
Utilisez cette syntaxe:
type Member struct {
Name string `json:"-"`
}
et le champ Nom sera ignoré lors du marshaling / unmarshaling.
Conversion des types de champs JSON
Vous pouvez utiliser des balises pour annoter le type dans lequel le JSON sera converti:
type Member struct {
Age int `json:"age,string"`
}
La structure membre a unAge
propriété représentée comme unint
. Et si vous voulez que ce soit unstring
à la place, mais JSON passe unint
?
Utilisez l'annotation de type:
type Member struct {
Age json.Number `json:"age,Number"`
}
Le type Number est un alias pourstring
.
En savoir plus sur les balises dansGo Tags expliqué
Maréchal JSON
Nous pourrions maintenant vouloir créer une chaîne JSON à partir de nos structures de données. Par exemple, il peut s'agir d'un programme qui prend un code de pays et renvoie les détails du pays correspondant au format JSON.
package main
import (
“encoding/json”
“fmt”
)
type country struct {
Name string
}
func main() {
country_code := “US”
<span style="color:#a6e22e">the_country</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">country</span>{}
<span style="color:#66d9ef">switch</span> <span style="color:#a6e22e">country_code</span> {
<span style="color:#66d9ef">case</span> <span style="color:#e6db74">"US"</span>:
<span style="color:#a6e22e">the_country</span>.<span style="color:#a6e22e">Name</span> = <span style="color:#e6db74">"United States"</span>
}
<span style="color:#a6e22e">c</span>, <span style="color:#a6e22e">err</span> <span style="color:#f92672">:=</span> <span style="color:#a6e22e">json</span>.<span style="color:#a6e22e">Marshal</span>(<span style="color:#a6e22e">the_country</span>)
<span style="color:#66d9ef">if</span> <span style="color:#a6e22e">err</span> <span style="color:#f92672">!=</span> <span style="color:#66d9ef">nil</span> {
panic(<span style="color:#a6e22e">err</span>)
}
<span style="color:#75715e">// c is now a []byte containing the encoded JSON
fmt.Print(string(c))
}
Une fois exécuté, ce programme imprimera{"Name":"United States"}
.
json.Marshal()
renvoie un[]byte
, nous devons donc le convertir en chaîne en le passant àfmt.Print()
, sinon vous verrez une liste de nombres apparemment dénués de sens (mais ils sont significatifs, car ce sont les octets réels qui composent la chaîne).
json.Marshal()
traitera correctement les types de base et composites tels que les tranches et les cartes.
Lire la suite
Lire la suitesur le blog Goet enleencoding/json
package doc
Plus de tutoriels go:
- Utilisation du proxy inverse NGINX pour servir les services Go
- Faire une copie d'une structure dans Go
- Les bases d'un serveur Web Go
- Trier un type de carte dans Go
- Allez les pointeurs en un mot
- Go Tags expliqué
- Aller au formatage de la date et de l'heure
- Traitement JSON avec Go
- Fonctions Go Variadic
- Fiche de triche Go Strings
- L'interface Go Empty expliquée
- Débogage Go avec VS Code et Delve
- Named Go renvoie des paramètres
- Générer des nombres et des chaînes aléatoires dans Go
- Structure du système de fichiers d'un projet Go
- Algorithme de recherche binaire implémenté dans Go
- Utilisation des indicateurs de ligne de commande dans Go
- GOPATH a expliqué
- Créez une application de ligne de commande avec Go: lolcat
- Création d'une commande CLI avec Go: cowsay
- Utilisation de Shell Pipes avec Go
- Tutoriel Go CLI: Clone de fortune
- Lister les fichiers dans un dossier avec Go
- Utilisez Go pour obtenir une liste des référentiels à partir de GitHub
- Allez, ajoutez une tranche de chaînes à un fichier
- Allez, convertissez une chaîne en une tranche d'octets
- Visualisez vos contributions Git locales avec Go
- Premiers pas avec Go CPU et profilage de la mémoire
- Résolution de l'erreur "ne prend pas en charge l'indexation" dans un programme Go
- Mesure du temps d'exécution dans un programme Go
- Création d'un robot d'exploration Web avec Go pour détecter les titres en double
- Go Best Practices: pointeur ou récepteurs de valeur?
- Go Best Practices: Devez-vous utiliser une méthode ou une fonction?
- Go Structures de données: définir
- Aide-mémoire Go Maps
- Générer des implémentations pour les types génériques dans Go
- Go Data Structures: Dictionnaire
- Structures de données Go: table de hachage
- Implémenter des écouteurs d'événements dans Passer par les canaux
- Go Structures de données: pile
- Go Structures de données: file d'attente
- Go Structures de données: arbre de recherche binaire
- Go Structures de données: graphique
- Structures de données Go: liste liée
- Le guide complet des structures de données Go
- Comparaison des valeurs Go
- Est-ce que Go est orienté objet?
- Travailler avec une base de données SQL dans Go
- Utilisation des variables d'environnement dans Go
- Tutoriel Go: API REST soutenue par PostgreSQL
- Activation de CORS sur un serveur Web Go
- Déployer une application Go dans un conteneur Docker
- Pourquoi Go est un langage puissant à apprendre en tant que développeur PHP
- Allez, supprimez le caractère de nouvelle ligne io.Reader.ReadString
- Allez, comment observer les changements et reconstruire votre programme
- Allez, comptez les mois depuis une date
- Accéder aux paramètres HTTP POST dans Go