Maison  >  Article  >  développement back-end  >  Comment désorganiser JSON dans une structure avec un champ étiqueté « json » ?

Comment désorganiser JSON dans une structure avec un champ étiqueté « json » ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-02 00:02:02176parcourir

How to Unmarshal JSON into a Struct with a Field Tagged with

Désassembler JSON dans une structure avec un champ marqué avec "json"

Lorsque vous essayez de désorganiser JSON dans une structure, vous pouvez rencontrer un scénario dans lequel un champ spécifique a une balise "json". Cette balise nécessite un traitement spécial pour garantir que les données JSON sont correctement converties au format de chaîne souhaité dans la structure.

Dans l'exemple fourni, la structure A a un champ S balisé avec sql:"type:json". L'objectif est de décomposer la valeur de "S" dans les données JSON fournies dans un format de chaîne au sein de la structure A.

Au départ, vous avez peut-être envisagé d'utiliser la réflexion pour vérifier si une balise de champ contient la chaîne "json ", puis désorganisez les données JSON dans ce champ sous forme de chaîne. Cependant, une approche plus efficace et plus élégante consiste à utiliser les fonctionnalités de la bibliothèque standard de Go.

Utilisation du type personnalisé et des méthodes Marshal/Unmarshal

Une façon d'y parvenir consiste à définir un type personnalisé RawString et à implémenter Méthodes MarshalJSON et UnmarshalJSON pour cela. Ces méthodes fournissent un moyen de contrôler la manière dont les données JSON sont respectivement codées et décodées.

Dans cet exemple, le type RawString encapsule une valeur de chaîne. La méthode MarshalJSON renvoie la valeur de la chaîne sous forme de tranche d'octets, tandis que la méthode UnmarshalJSON ajoute les données reçues au RawString existant.

Marshaling et Unmarshaling le JSON

L'étape suivante consiste à définir le A struct, qui comprend le champ I (un entier de 64 bits) et le champ S de type RawString.

À l'aide de ces types et méthodes personnalisés, vous pouvez désorganiser les données JSON fournies dans la structure A. Le code Go suivant le démontre :

<code class="go">import (
    "encoding/json"
    "fmt"
    "log"
)

// RawString is a raw encoded JSON object.
// It implements Marshaler and Unmarshaler and can
// be used to delay JSON decoding or precompute a JSON encoding.
type RawString string

// MarshalJSON returns *m as the JSON encoding of m.
func (m *RawString) MarshalJSON() ([]byte, error) {
    return []byte(*m), nil
}

// UnmarshalJSON sets *m to a copy of data.
func (m *RawString) UnmarshalJSON(data []byte) error {
    if m == nil {
        return errors.New("RawString: UnmarshalJSON on nil pointer")
    }
    *m += RawString(data)
    return nil
}

const data = `{"i":3, "S":{"phone": {"sales": "2223334444"}}}`

type A struct {
    I int64
    S RawString `sql:"type:json"`
}

func main() {
    a := A{}
    err := json.Unmarshal([]byte(data), &a)
    if err != nil {
        log.Fatal("Unmarshal failed", err)
    }
    fmt.Println("Done", a)
}</code>

En utilisant cette approche, vous pouvez efficacement regrouper les données JSON dans une structure avec un champ étiqueté avec "json" et conserver son format de chaîne d'origine.

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