258 votes

Conversion de la structure Go en JSON

J'essaie de convertir une structure Go en JSON en utilisant le paquet json mais tout ce que je reçois est {}. Je suis sûr que c'est quelque chose d'é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))
}

Puis quand j'essaie de l'exécuter, j'ai ceci :

$ 6g test.go && 6l -o test test.6 && ./test 
{}

448voto

peterSO Points 25725

Vous devez exporter le champ User.name afin que le package 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"}

82voto

Problème connexe :

J'avais du mal à convertir struct en JSON, à l'envoyer en réponse de Golang, puis, plus tard, attraper la même chose en JavaScript via Ajax.

Perdu beaucoup de temps, donc la solution de publication ici.

Dans Go :

// 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);

6voto

Hieu Vo Points 378

Vous pouvez définir vos propres méthodes personnalisées MarshalJSON et UnmarshalJSON et contrôler intentionnellement ce qui doit être inclus, par exemple :

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))
}

5voto

weiwhy Points 61

C'est une question intéressante, il est très facile d'utiliser les nouvelles versions de go. Vous devriez le faire :

package main

import (
    "fmt"
    "encoding/json"
)

type User struct {
    Name string `json:"name"`
}

func main() {
    user := &User{name:"Frank"}
    b, err := json.Marshal(user)
    if err != nil {
        fmt.Printf("Error: %s", err)
        return;
    }
    fmt.Println(string(b))
}

Changez ce nom en Nom.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X