Travailler avec des données JSON implique souvent de les convertir en structures pour un traitement ultérieur. Cependant, des défis surviennent lorsque les structures contiennent des champs avec des balises personnalisées qui ont un impact sur le processus de démarchage. Cet article montre comment gérer de tels scénarios en utilisant les capacités de réflexion de Go.
Dans cette situation particulière, l'objectif est de regrouper les données JSON dans une structure où l'un de ses champs a une balise. cela indique qu'il doit être traité comme une chaîne JSON. Considérons cet exemple :
<code class="go">const data = `{ "I": 3, "S": { "phone": { "sales": "2223334444" } } }` type A struct { I int64 S string `sql:"type:json"` }</code>
Dans ce cas, l'objectif est de désorganiser le champ "S" dans le JSON sous forme de chaîne dans la structure A.
Go fournit une méthode UnmarshalJSON intégrée qui permet un comportement de démarshall personnalisé. En créant un nouveau type, en implémentant les méthodes MarshalJSON et UnmarshalJSON, nous pouvons obtenir le résultat souhaité :
<code class="go">import ( "encoding/json" "errors" "log" "fmt" ) // 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>
Dans cette solution, le type RawString implémente les méthodes MarshalJSON et UnmarshalJSON pour contrôler la manière dont les données JSON sont codées et décodé, permettant essentiellement au champ « S » d'être traité comme une chaîne lors du démarshalling.
En tirant parti des capacités de réflexion de Go et des méthodes de démarshalling personnalisées, il est possible de gérer des scénarios de démarshalling JSON complexes même lorsque les champs ont des balises spécifiques qui nécessitent un traitement spécial.
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!