J'essaie de convertir une structure Go en JSON à l'aide du package json
, mais tout ce que j'obtiens est {}
. Je suis certain que c'est quelque chose de tout à fait évident mais je ne le vois pas.
package main
import (
"fmt"
"encoding/json"
)
type User struct {
name string
}
func main() {
user := &User{name:"Frank"}
b, err := json.Marshal(user)
if err != nil {
fmt.Printf("Error: %s", err)
return;
}
fmt.Println(string(b))
}
Alors quand j'essaye de le lancer, j'obtiens ceci:
$ 6g test.go && 6l -o test test.6 && ./test
{}
Vous devez exporter le champ User.name
afin que le paquetage json
puisse le voir. Renommez le champ name
en Name
.
package main
import (
"fmt"
"encoding/json"
)
type User struct {
Name string
}
func main() {
user := &User{Name: "Frank"}
b, err := json.Marshal(user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(b))
}
Sortie:
{"Name":"Frank"}
Question connexe:
J'avais du mal à convertir struct en JSON, à l'envoyer en réponse à Golang, puis à intercepter plus tard la même chose en JavaScript via Ajax.
Gâché beaucoup de temps, donc poster la solution ici.
En aller:
// web server
type Foo struct {
Number int `json:"number"`
Title string `json:"title"`
}
foo_marshalled, err := json.Marshal(Foo{Number: 1, Title: "test"})
fmt.Fprint(w, string(foo_marshalled)) // write response to ResponseWriter (w)
En JavaScript:
// web call & receive in "data", thru Ajax/ other
var Foo = JSON.parse(data);
console.log("number: " + Foo.number);
console.log("title: " + Foo.title);
J'espère que ça aide quelqu'un.
Bonne chance.
Les valeurs de structure encodent en tant qu'objets JSON. Chaque champ struct exporté devient membre de l'objet sauf si:
Les valeurs vides sont false, 0, tout pointeur nil ou valeur d'interface, ainsi que tout tableau, tranche, carte ou chaîne de longueur zéro. La chaîne de clé par défaut de l'objet est le nom du champ struct, mais peut être spécifiée dans la valeur de balise du champ struct. La clé "json" dans la valeur de balise du champ struct est le nom de la clé, suivi d'une virgule facultative et des options.
Vous pouvez définir vos propres méthodes MarshalJSON et UnmarshalJSON personnalisées et contrôler intentionnellement ce qui doit être inclus, ex:
package main
import (
"fmt"
"encoding/json"
)
type User struct {
name string
}
func (u *User) MarshalJSON() ([]byte, error) {
return json.Marshal(&struct {
Name string `json:"name"`
}{
Name: "customized" + u.name,
})
}
func main() {
user := &User{name: "Frank"}
b, err := json.Marshal(user)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(b))
}