json.Marshal (struct) возвращает «{}»


128
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 практически пуст?

Ответы:


233

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

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

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

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

playground


не должно быть «пробела» перед «omitempty»
Дэймон

Могу я сделать с маленькой буквы?
user123456

Если вы хотите пометить поля
строчными буквами

1
@ user123456 Задайте имя поля JSON в нижнем регистре с помощью jsonтега поля (как описано в последнем абзаце этого ответа).
Muffin Top

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

Примеры

 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
 }

3
классный человек, работа идеальна, только первая буква
vuhung3990

2
Точно In Go, a name is exported if it begins with a capital letter. Чтобы поместить это в контекст, посетите этот тур по Go Basics
Mohsin

3

В голанге

в структуре первая буква должна быть прописной, например. номер телефона -> Номер телефона

======= Добавить детали

Сначала я пробую писать вот так

type Questions struct {
    id           string
    questionDesc string
    questionID   string
    ans          string
    choices      struct {
        choice1 string
        choice2 string
        choice3 string
        choice4 string
    }
}

Компиляция golang не является ошибкой и не показывает предупреждения. Но ответ пуст, потому что что-то

После этого я поискал в google нашел эту статью

Статья о типах структур и литералах типов структур ... Я пытаюсь редактировать код.

//Questions map field name like database
type Questions struct {
    ID           string
    QuestionDesc string
    QuestionID   string
    Ans          string
    Choices      struct {
        Choice1 string
        Choice2 string
        Choice3 string
        Choice4 string
    }
}

Это работа.

Надеюсь на помощь.


1
добавить подробности
Василий

Yapp, добавляю подробностей.
superup
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.