Maison >développement back-end >Golang >Comment puis-je personnaliser le démarshaling JSON pour gérer les valeurs booléennes ambiguës ?
Élargissement des options d'analyse booléenne dans le démarshaling JSON
Lors du mappage des sorties de service qui brouillent les frontières entre les types booléens et d'autres valeurs, un JSON plus accommodant l'analyseur devient indispensable. La fonction intégrée d'encodage/json unmarshal n'est pas à la hauteur à cet égard, ce qui incite à rechercher des alternatives d'analyse permissive.
Une approche consiste à créer une fonction UnmarshalJSON personnalisée pour le type souhaité. Cette fonction peut définir des règles d'analyse personnalisées pour gérer les valeurs booléennes ambiguës. Par exemple, considérons le type ConvertibleBoolean suivant :
type ConvertibleBoolean bool func (bit *ConvertibleBoolean) UnmarshalJSON(data []byte) error { asString := string(data) if asString == "1" || asString == "true" { *bit = true } else if asString == "0" || asString == "false" { *bit = false } else { return errors.New(fmt.Sprintf("Boolean unmarshal error: invalid input %s", asString)) } return nil }
Dans cette fonction, les chaînes "1" et "true" sont mappées à true, tandis que "0" et "false" sont analysées comme fausses. Les valeurs en dehors de ces plages déclenchent une erreur.
Pour utiliser cette analyse booléenne personnalisée, appliquez une balise json au champ cible. Par exemple :
type MyType struct { AsBoolean ConvertibleBoolean `json:"field1"` AlsoBoolean ConvertibleBoolean `json:"field2"` }
Avec ces règles d'analyse personnalisées en place, l'entrée JSON :
{ "field1": true, "field2": 1 }
Produira la structure non marshalée suivante :
obj := MyType{} json_err := json.Unmarshal([]byte(input_json), &obj) fmt.Printf("%v\n", obj.AsBoolean) //"true" fmt.Printf("%v\n", obj.AlsoBoolean) //"true"
Par en tirant parti des fonctions d'analyse personnalisées, vous gagnez en flexibilité dans le démarshaling JSON, vous permettant de gérer des valeurs booléennes ambiguës comme nécessaire.
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!