json.Marshal (struct) "{}" değerini döndürür


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[:]))
}

İşte çıktı:

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

JSON neden esasen boş?

Yanıtlar:


233

Alan adının ilk harfini büyük harf yaparak TestObject'teki alanları dışa aktarmanız gerekir . Değişim kindiçin Kindvb.

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

Kodlama / json paketi ve benzer paketler, aktarılmayan alanları göz ardı eder.

`json:"..."`Saha bildirimleri izleyin dizelerdir yapı etiketleri . Bu yapıdaki etiketler, JSON'a ve JSON'dan sıralarken yapı alanlarının adlarını belirler.

playground


"boşluktan" önce "boşluk" olmaması gerekiyordu
Damon

Küçük harfle yapabilir miyim?
user123456

Küçük harf etiketi istiyorsanız, stackoverflow.com/questions/21825322/…
user123456

1
@ user123456 jsonAlan etiketini kullanarak JSON alan adını küçük harfli bir ada ayarlayın (bu cevabın son paragrafında açıklandığı gibi).
Muffin Top

28
  • İlk harf büyük olduğunda, tanımlayıcı kullanmak istediğiniz herhangi bir kod parçası için geneldir.
  • İlk harf küçük olduğunda, tanımlayıcı özeldir ve yalnızca bildirildiği paketin içinden erişilebilir.

Örnekler

 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
harika adam, mükemmel iş sadece ilk harfi
BÜYÜK

2
Kesinlikle In Go, a name is exported if it begins with a capital letter,. Bağlama koymak için, bu Go Basics Turunu
Mohsin

3

Golang'da

yapısında ilk harf büyük olmalıdır örn. telefon numarası -> Telefon Numarası

======= Ayrıntı ekle

İlk önce böyle kodlamayı deneyeceğim

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

golang derlemesi hata değildir ve uyarı göstermez. Ama cevap boş çünkü bir şey

Ondan sonra, google'da bu makaleyi buldum

Struct Tipleri ve Struct Type Literals Makalesi sonra ... Kodu düzenlemeyi deniyorum.

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

İştir.

Yardım için umut.


1
daha fazla ayrıntı ekle
Basil

Yapp, daha fazla ayrıntı ekliyorum.
superup
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.