json.Marshal (struct) mengembalikan "{}"

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

Berikut hasilnya:

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

Mengapa JSON pada dasarnya kosong?

Doug Knesek
sumber

Jawaban:

233

Anda perlu mengekspor bidang dalam TestObject dengan menggunakan huruf besar pada nama bidang. Ubah kindke Kinddan sebagainya.

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

Paket encoding / json dan paket serupa mengabaikan bidang yang tidak diekspor.

The `json:"..."`string yang mengikuti deklarasi bidang yang tag struct . Tag di struct ini menetapkan nama bidang struct ketika marsaling ke dan dari JSON.

playground

Muffin Top
sumber
seharusnya tidak ada "ruang" sebelum "omitempty"
Damon
Bisakah saya membuat surat kecil?
user123456
Jika Anda ingin tag huruf kecil, bidang stackoverflow.com/questions/21825322/...
user123456
1
@ user123456 Tetapkan nama bidang JSON ke nama huruf kecil menggunakan jsontag bidang (seperti yang dijelaskan dalam paragraf terakhir dari jawaban ini).
Muffin Top
28
  • Ketika huruf pertama dikapitalisasi , identifier adalah publik untuk setiap bagian dari kode yang Anda ingin digunakan.
  • Ketika huruf pertama adalah huruf kecil , pengenal bersifat pribadi dan hanya bisa diakses dalam paket yang dinyatakan.

Contohnya

 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
sumber
3
pria yang luar biasa, bekerja dengan sempurna, hanya mengubah huruf pertama menjadi KASUS UPPER, terima kasih banyak
vuhung3990
2
Tepatnya In Go, a name is exported if it begins with a capital letter. Untuk memasukkannya dalam konteks, kunjungi Tur Dasar-dasar Pergi
Mohsin
3

Di golang

dalam struct huruf pertama harus huruf kapital ex. nomor telepon -> Nomor Telepon

======= Tambahkan detail

Pertama, saya mencoba coding seperti ini

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

kompilasi golang bukan error dan tidak menunjukkan peringatan. Tetapi respons itu kosong karena sesuatu

Setelah itu, saya mencari google menemukan artikel ini

Jenis Struct dan Struct Type Literals Article then ... Saya mencoba mengedit kode.

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

Apakah pekerjaan.

Semoga bantuan.

Superup
sumber
1
tambahkan rincian lebih lanjut
Basil
Yapp, saya menambahkan lebih banyak detail.
Superup