web-dev-qa-db-fra.com

Quelle entrée entraînera le json.Marshal de golang pour retourner une erreur?

De la docs :

JSON ne peut pas représenter les structures de données cycliques et Marshal ne les gère pas. Passer des structures cycliques à Marshal entraînera une récursion infinie.

J'ai rencontré cette situation, ce qui entraîne une panique d'exécution.

Ce que je me demande, c'est si quelqu'un peut fournir un programme de travail qui démontre une situation sans panique où json.Marshal renvoie une erreur non nulle. Les meilleures réponses devraient inclure clairement les entrées utilisées .

24
mdwhatcott

Pour compléter la réponse de Jonathan, la fonction json.Marshal peut renvoyer deux types d'erreurs: UnsupportedTypeError ou UnsupportedValueError

Le premier peut être causé, comme l'a dit Jonathan en essayant de marshaler un type invalide:

_, err := json.Marshal(make(chan int))
_, ok := err.(*json.UnsupportedTypeError) // ok == true

D'un autre côté, vous pouvez également demander à la fonction Marshal de renvoyer une erreur en transmettant une valeur non valide:

_, err := json.Marshal(math.Inf(1))
_, ok := err.(*json.UnsupportedValueError) // ok == true
21
hbejgel

Mise à jour: utilise maintenant un canal au lieu d'une carte [int] int pour provoquer l'erreur


Structures spécifiques à Go, par exemple. func ou chan refusent de sérialiser:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    value := make(chan int)
    _, err := json.Marshal(value)
    fmt.Println(err)
}
17
Jonathan Oliver