json.Marshal (struct) zwraca „{}”

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 = "[email protected]"

    fmt.Println(testObject)

    b, err := json.Marshal(testObject)

    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(string(b[:]))
}

Oto wynik:

[ `go test -test.run="^TestCreateSingleItemResponse$"` | done: 2.195666095s ]
    {TestObject f73h5jf8 Yuri Gagarin Yuri.Gagarin@Vostok.com}
    {}
    PASS

Dlaczego JSON jest zasadniczo pusty?

Doug Knesek
źródło

Odpowiedzi:

233

Musisz wyeksportować pola w TestObject, zaczynając wielką literę w nazwie pola. Zmień kindna Kindi tak dalej.

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

Pakiet encoding / json i podobne pakiety ignorują niezaeksportowane pola.

Te `json:"..."`ciągi, które następują deklaracje pól są znaczniki struct . Tagi w tej strukturze ustawiają nazwy pól struktury podczas organizowania do iz formatu JSON.

playground

Top Muffin
źródło
nie powinno być „spacji” przed „omitempty”
Damon,
Czy mogę zrobić małą literą?
user123456
Jeśli chcesz oznaczać małą literę, pola stackoverflow.com/questions/21825322/ ...
user123456
1
@ user123456 Ustaw nazwę pola JSON na nazwę zapisaną małymi literami, używając jsonznacznika pola (zgodnie z opisem w ostatnim akapicie tej odpowiedzi).
Muffin Top
28
  • Gdy pierwsza litera jest pisana wielką literą , identyfikator jest publiczny dla każdego fragmentu kodu, którego chcesz użyć.
  • Gdy pierwsza litera jest mała , identyfikator jest prywatny i można było uzyskać do niego dostęp tylko w pakiecie, do którego został zadeklarowany.

Przykłady

 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
 }
Sourabh Bhagat
źródło
3
niesamowity człowiek, praca idealna tylko zmień pierwszą literę na
WIELKĄ LITERĘ
2
Dokładnie In Go, a name is exported if it begins with a capital letter. Aby umieścić to w kontekście, odwiedź tę Go Basics Tour
Mohsin
3

W golang

w strukturze pierwsza litera musi być wielka np. phonenumber -> PhoneNumber

======= Dodaj szczegóły

Najpierw spróbuję kodować w ten sposób

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

kompilacja golang nie jest błędem i nie wyświetla ostrzeżenia. Ale odpowiedź jest pusta, ponieważ coś

Potem wyszukałem google i znalazłem ten artykuł

Typy struktur i literały typów struktur Następnie artykuł ... Spróbuję edytować kod.

//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
    }
}

To praca.

Mam nadzieję na pomoc.

superup
źródło
1
dodaj więcej szczegółów
Bazylia
Yapp, dodaję więcej szczegółów.
superup