json.Marshal (struct) trả về


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

Đây là đầu ra:

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

Tại sao JSON về cơ bản là trống rỗng?

Câu trả lời:


233

Bạn cần xuất các trường trong TestObject bằng cách viết hoa chữ cái đầu tiên trong tên trường. Thay đổi kindđể Kindvà vân vân.

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

Gói mã hóa / json và các gói tương tự bỏ qua các trường không được báo cáo.

Các `json:"..."`chuỗi theo sau khai báo trường là thẻ struct . Các thẻ trong cấu trúc này đặt tên của các trường của cấu trúc khi sắp xếp theo và từ JSON.

playground


đáng lẽ không có "khoảng trống" trước "omitempty"
Damon

Tôi có thể làm với chữ nhỏ không?
user123456

Nếu bạn muốn gắn thẻ chữ nhỏ, các trường stackoverflow.com/questions/21825322/ từ
user123456

1
@ user123456 Đặt tên trường JSON thành tên chữ thường bằng cách sử dụng jsonthẻ trường (như được mô tả trong đoạn cuối của câu trả lời này).
Muffin Top

28
  • Khi chữ cái đầu tiên được viết hoa , mã định danh được công khai cho bất kỳ đoạn mã nào bạn muốn sử dụng.
  • Khi chữ cái đầu tiên là chữ thường , định danh là riêng tư và chỉ có thể được truy cập trong gói được khai báo.

Ví dụ

 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
người đàn ông tuyệt vời, công việc hoàn hảo chỉ thay đổi chữ cái đầu tiên thành UPPER CASE, cảm ơn bạn rất nhiều
vuhung3990

2
Chính xác , In Go, a name is exported if it begins with a capital letter. Để đặt nó trong bối cảnh, hãy truy cập Chuyến tham quan cơ bản này
Mohsin

3

Ở golang

trong struct chữ cái đầu tiên phải viết hoa ex. số điện thoại -> Số điện thoại

======= Thêm chi tiết

Đầu tiên, tôi thử mã hóa như thế này

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

golang biên dịch không có lỗi và không hiển thị cảnh báo. Nhưng phản hồi trống rỗng vì một cái gì đó

Sau đó, tôi tìm kiếm google tìm thấy bài viết này

Kiểu cấu trúc và Kiểu cấu trúc Bài viết sau đó ... Tôi thử chỉnh sửa mã.

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

Là công việc.

Mong mọi người giúp đỡ.


1
thêm chi tiết
Basil

Yapp, tôi thêm chi tiết.
siêu sao
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.