json.Marshal (โครงสร้าง) ส่งกลับ“ {}”


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


ไม่ควรมี "ช่องว่าง" ก่อน "ละเว้น"
เดมอน

ฉันสามารถทำด้วยตัวอักษรขนาดเล็กได้หรือไม่?
user123456

หากคุณต้องการแท็กตัวอักษรขนาดเล็กที่ช่อง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
ผู้ชายที่ยอดเยี่ยมทำงานได้อย่างสมบูรณ์แบบเท่านั้นเปลี่ยนอักษรตัวแรกเป็น UPPER CASE ขอบคุณมาก
vuhung3990

2
In Go, a name is exported if it begins with a capital letterตรง เพื่อให้สอดคล้องกับบริบทโปรดไปที่Go Basics Tour
Mohsin

3

ในโกลัง

ในโครงสร้างอักษรตัวแรกต้องเป็นตัวพิมพ์ใหญ่เช่น phonenumber -> เบอร์โทรศัพท์

======= เพิ่มรายละเอียด

ก่อนอื่นฉันลองเขียนโค้ดแบบนี้

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
เพิ่มรายละเอียด
Basil

ใช่ฉันเพิ่มรายละเอียดเพิ่มเติม
superup
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.