Maison >développement back-end >Golang >Comment désorganiser les données JSON avec des champs balisés dans Go ?
Comment désorganiser JSON avec des champs balisés
Lors de la désorganisation de JSON dans une structure, il peut être nécessaire de spécifier comment certains champs sont gérés. Pour ce faire, des balises peuvent être ajoutées aux champs struct pour fournir des informations supplémentaires au processus de démarshalisation.
Dans un scénario où vous devez démarshaler un champ JSON sous forme de chaîne dans un champ struct avec une balise, un une solution simple utilisant la réflexion peut être mise en œuvre :
<code class="go">package main import ( "encoding/json" "fmt" "log" "reflect" ) type A struct { I int64 S string `sql:"type:json"` } const data = `{ "I": 3, "S": { "phone": { "sales": "2223334444" } } }` func main() { var a A err := json.Unmarshal([]byte(data), &a) if err != nil { log.Fatal("Unmarshal failed", err) } rt := reflect.TypeOf(a) rv := reflect.ValueOf(&a) for i := 0; i < rt.NumField(); i++ { f := rt.Field(i) if f.Tag.Get("json") != "" { fv := rv.Elem().Field(i) fv.SetString(string(fv.Bytes())) } } fmt.Println("Done", a) }</code>
Cependant, une approche plus élégante est disponible dans Go qui élimine le besoin de réflexion :
<code class="go">package main 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>
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!