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"`
}

Пакет кодування / json і подібні пакети ігнорують не експортовані поля.

Ці `json:"..."`рядки , які слідують оголошення полів є Struct мітки . Теги в цій структурі задають назви полів структури при переміщенні в JSON і з нього.

playground


перед "omitempty" не повинно бути "місця"
Деймон

Чи можу я зробити з малої літери?
користувач123456

Якщо ви хочете , рядкова тег Поля stackoverflow.com/questions/21825322 / ...
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
чудовий чоловік, ідеально працюйте лише змінити перший лист до
ГОЛОВНОГО СЛУЧАЯ,

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, я додаю більше деталей.
суперуп
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.