формат JSON.Маршал (структура) возвращает "{}"


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 = "Yuri.Gagarin@Vostok.com"

    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 Yuri.Gagarin@Vostok.com}
    {}
    PASS

почему JSON по существу пуст?

2 74

2 ответа:

вам нужно экспорт поля в TestObject путем заглавной буквы в имени Поля. Изменить kind to Kind и так далее.

type TestObject struct {
 Kind string `json:"kind"`
 Id   string `json:"id,omitempty"`
 Name  string `json:"name"`
 Email string `json:"email"`
}

пакет encoding/json и аналогичные пакеты игнорируют несообщенные поля.

The `json:"..."` строки, следующие за объявлениями полей, являются теги структуры. Теги в этой структуре задают имена полей структуры при маршалинге В и из формат JSON.

детская площадка

  • когда первая буква С большой буквы, идентификатор является общедоступным для любого кусок кода, который вы хотите использовать.
  • когда первая буква строчные буквы, идентификатор является частным и доступ возможен только в пределах пакета, который был объявлен.

примеры

 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
 }