Maison > développement back-end > Golang > Comment puis-je personnaliser le démarshaling JSON pour gérer les valeurs booléennes ambiguës ?

Comment puis-je personnaliser le démarshaling JSON pour gérer les valeurs booléennes ambiguës ?

Barbara Streisand
Libérer: 2024-11-29 05:49:09
original
175 Les gens l'ont consulté

How Can I Customize JSON Unmarshaling to Handle Ambiguous Boolean Values?

É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
}
Copier après la connexion

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"`
}
Copier après la connexion

Avec ces règles d'analyse personnalisées en place, l'entrée JSON :

{
    "field1": true,
    "field2": 1
}
Copier après la connexion

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"
Copier après la connexion

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal