web-dev-qa-db-fra.com

Conversion de la structure Go en JSON

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 
{}
142
magiconair

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"}
283
peterSO

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.

50

Les valeurs de structure encodent en tant qu'objets JSON. Chaque champ struct exporté devient membre de l'objet sauf si:

  • la balise du champ est "-", ou
  • le champ est vide et sa balise spécifie l'option "omitempty".

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.

6
GoLang Master

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

0
Hieu Vo