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
Barbara Streisandoriginal
2024-11-29 05:49:09176parcourir

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
}

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!

Déclaration:
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