Мои структуры не сортируются в json
Я использую Go 1.0.3 в Mac OS X 10.8.2, и я экспериментирую с пакетом json
, пытаясь упорядочить структуру json, но я продолжаю получать пустой объект {}
json.
Значение err
равно nil, поэтому в соответствии с функцией json.Marshal
ничего не происходит, и структура правильная. Почему это происходит?
package main
import (
"encoding/json"
"fmt"
)
type Address struct {
street string
extended string
city string
state string
zip string
}
type Name struct {
first string
middle string
last string
}
type Person struct {
name Name
age int
address Address
phone string
}
func main() {
myname := Name{"Alfred", "H", "Eigenface"}
myaddr := Address{"42 Place Rd", "Unit 2i", "Placeton", "ST", "00921"}
me := Person{myname, 24, myaddr, "000 555-0001"}
b, err := json.Marshal(me)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(b)) // err is nil, but b is empty, why?
fmt.Println("\n")
fmt.Println(me) // me is as expected, full of data
}
Ответы
Ответ 1
Вы должны сделать поля, которые вы хотите сделать публичными. Как это:
type Address struct {
Street string
Extended string
City string
State string
Zip string
}
err
равна nil
потому что все экспортированные поля, в данном случае их нет, были правильно распределены.
Рабочий пример: https://play.golang.org/p/9NH9Bog8_C6
Проверьте документы http://godoc.org/encoding/json/#Marshal
Ответ 2
Обратите внимание, что вы также можете управлять тем, что имя полей в сгенерированном JSON выполняется следующим образом:
type Name struct {
First string `json:"firstname"`
Middle string `json:"middlename"`
Last string `json:"lastname"`
}
Ответ 3
Библиотека JSON не может просматривать поля в структуре, если они не являются открытыми. В твоем случае,
type Person struct {
name Name
age int
address Address
phone string
}
Имя поля, возраст, адрес и телефон не являются общедоступными (начните с маленькой буквы). В golang переменные/функции общедоступны, когда они начинаются с заглавной буквы. Таким образом, чтобы это работало, ваша структура должна выглядеть примерно так:
type Person struct {
Name Name
Age int
Address Address
Phone string
}