Преобразование структуры Go в JSON
Я пытаюсь преобразовать структуру Go в JSON с помощью пакета json
, но все, что я получаю, это {}
. Я уверен, что это нечто совершенно очевидное, но я этого не вижу.
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))
}
Затем, когда я пытаюсь запустить его, я получаю следующее:
$ 6g test.go && 6l -o test test.6 && ./test
{}
Ответы
Ответ 1
Вам нужно export поле User.name
, чтобы пакет json
мог его увидеть. Переименуйте поле name
в 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))
}
Вывод:
{"Name":"Frank"}
Ответ 2
Связанная проблема:
У меня возникла проблема с преобразованием структуры в JSON, посылая ее как ответ от Golang, затем, позже, поймать то же самое в JavaScript через Ajax.
Отпущено много времени, поэтому разместите решение здесь.
В 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)
В JavaScript:
// web call & receive in "data", thru Ajax/ other
var Foo = JSON.parse(data);
console.log("number: " + Foo.number);
console.log("title: " + Foo.title);
Надеюсь, это поможет кому-то.
Удачи.
Ответ 3
Структурные значения кодируются как объекты JSON. Каждое экспортированное поле структуры становится членом объекта, если:
- тег поля "-" или
- поле пустое, а его тег определяет опцию "omitempty".
Пустыми значениями являются false, 0, любой нулевой указатель или значение интерфейса, а также любой массив, фрагмент, карта или строка нулевой длины. Строка ключа объекта по умолчанию - это имя структурного поля, но оно может быть указано в значении тега структурного поля. Ключ "json" в значении тега struct field представляет собой имя ключа, за которым следует необязательная запятая и параметры.
Ответ 4
Вы можете определить свои собственные методы MarshalJSON и UnmarshalJSON и преднамеренно контролировать то, что должно быть включено, например:
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))
}