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

    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?

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


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
 }

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.


1
dodaj więcej szczegółów
— Bazylia

Yapp, dodaję więcej szczegółów.
— superup
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.