Maison > développement back-end > Golang > Comment résoudre l'erreur « Impossible de démarshaler... » dans Golang ?

Comment résoudre l'erreur « Impossible de démarshaler... » dans Golang ?

WBOY
Libérer: 2023-06-24 20:01:59
original
4351 Les gens l'ont consulté

Pendant le processus de développement de Golang, nous utilisons souvent JSON pour l'échange de données et la sérialisation. Cependant, lorsque nous essayons de désérialiser des données JSON dans une structure, nous rencontrons parfois des erreurs « impossible de désérialiser … ». Ce message d'erreur est énigmatique, difficile à comprendre et déroutant. Cet article vous aidera à comprendre la cause de cette erreur et vous proposera plusieurs solutions.

Solution 1 : Vérifiez le type des variables membres de la structure

L'erreur "Impossible de démarcher..." est généralement causée par une inadéquation entre la valeur de la chaîne JSON et le type de la variable membre de la structure. Pour éviter cette erreur, nous devons nous assurer que lors de la déclaration de la structure, le type de chaque variable membre correspond à la valeur correspondante dans JSON.

Par exemple, nous définissons la structure suivante :

type Person struct {
    Name string
    Age  int
}
Copier après la connexion

Si nous essayons de désérialiser le JSON suivant dans une structure, nous rencontrerons l'erreur "cannot unmarshal..." :

{
    "Name": "Lucy",
    "Age": "28"
}
Copier après la connexion

Cela est dû au type de valeur Age. en JSON, il s'agit d'une chaîne et ne peut pas correspondre au type de variable membre Age int dans la structure. Nous devons définir le type d'Age sous forme de chaîne pour désérialiser correctement les données JSON.

Solution 2 : Vérifiez les balises des variables membres de la structure

Normalement, si nous définissons une balise pour le champ dans la variable membre de la structure, alors les informations de la balise guideront les données JSON lors de la désérialisation, utilisées pour identifier le nom et d'autres détails de chaque champ. Par conséquent, lors de la désérialisation de JSON, si les informations de balise ne correspondent pas au nom d'attribut dans les données JSON, cette erreur peut également se produire.

Par exemple, nous définissons la structure suivante :

type Person struct {
    Name string `json:"PersonName"`
    Age  int    `json:"PersonAge"`
}
Copier après la connexion

Si nous essayons de désérialiser le JSON suivant en une structure, nous rencontrerons également l'erreur "cannot unmarshal..." :

{
    "Name": "Lucy",
    "Age": 28
}
Copier après la connexion

C'est parce que nous le cédons la structure Les deux champs Name et Age définissent l'étiquette, mais les noms de champs définis dans l'étiquette sont incohérents avec les noms d'attribut dans les données JSON. Par conséquent, nous devons remplacer le nom de l'attribut dans les données JSON par le nom de la balise définie dans la structure pour le désérialiser correctement.

Solution 3 : utilisez le propre package json de Golang pour les annotations

Une autre méthode consiste à utiliser le propre package json de Golang pour éviter les erreurs « impossible de désorganiser… » via les annotations. Cette méthode nous oblige à ajouter des balises json à chaque champ lors de la définition de la structure, comme indiqué ci-dessous :

type Person struct {
    Name string `json:"name"`
    Age int `json:"age"`
}
Copier après la connexion

Lors de la désérialisation de JSON, nous devons utiliser la méthode json.Unmarshal dans le code et prendre les données JSON en entrée. De cette façon, les données JSON peuvent être désérialisées correctement, par exemple :

p := &Person{}
jsonData := []byte(`{"name":"John","age":18}`)
err := json.Unmarshal(jsonData, p)
if err != nil {
    fmt.Println("Unmarshal error: ", err)
}
fmt.Printf("Name: %s, Age: %d", p.Name, p.Age)
Copier après la connexion

Résumé

Dans la plupart des cas, l'erreur "Impossible de désérialiser..." est généralement due à une inadéquation entre le type des données JSON et le type de la variable membre de la structure ou Cela est dû à une inadéquation entre les informations de balise et les noms d'attribut dans les données JSON. En vérifiant attentivement ces problèmes, nous pouvons éviter cette erreur. Si vous souhaitez mieux résoudre cette erreur, veuillez utiliser le propre package json de Golang pour la gestion des annotations.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal