Перейти json.Marshal(struct) возвращает "{}"
type TestObject struct {
kind string `json:"kind"`
id string `json:"id, omitempty"`
name string `json:"name"`
email string `json:"email"`
}
func TestCreateSingleItemResponse(t *testing.T) {
testObject := new(TestObject)
testObject.kind = "TestObject"
testObject.id = "f73h5jf8"
testObject.name = "Yuri Gagarin"
testObject.email = "[email protected]"
fmt.Println(testObject)
b, err := json.Marshal(testObject)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(b[:]))
}
Вот результат:
[ `go test -test.run="^TestCreateSingleItemResponse$"` | done: 2.195666095s ]
{TestObject f73h5jf8 Yuri Gagarin [email protected]}
{}
PASS
Почему JSON по существу пуст?
Ответы
Ответ 1
Вам нужно export поля в TestObject, запустив имена полей с заглавной буквой Юникода.
type TestObject struct {
Kind string `json:"kind"`
ID string `json:"id,omitempty"`
Name string `json:"name"`
Email string `json:"email"`
}
Пакет encoding/json и подобные пакеты игнорируют невыполненные поля.
Строки `json:"..."`
, которые следуют за декларациями полей, теги структуры. Теги в этой структуре устанавливают имена полей структуры при маршалинге и из JSON.
игровая площадка
Ответ 2
- Когда первая буква с заглавной буквы, идентификатор является общедоступным для любого
кусок кода, который вы хотите использовать.
- Когда первая буква строчная, идентификатор является приватным и
может быть доступен только в объявленном пакете.
Примеры
var aName // private
var BigBro // public (exported)
var 123abc // illegal
func (p *Person) SetEmail(email string) { // public because SetEmail() function starts with upper case
p.email = email
}
func (p Person) email() string { // private because email() function starts with lower case
return p.email
}