json.Marshal (struct)는“{}”을 반환합니다.


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의 필드를. 변경 kindKind등등.

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


"omitempty"이전에는 "공간"이 없어야합니다
Damon

작은 글자로 만들 수 있습니까?
user123456

작은 문자 태그를 원하면 stackoverflow.com/questions/21825322/…
user123456

1
@ user123456 json필드 태그를 사용하여 JSON 필드 이름을 소문자 이름으로 설정하십시오 (이 답변의 마지막 단락에 설명 된대로).
머핀 탑

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
멋진 남자, 완벽 한 작업 첫 번째 편지 만 대문자로 변경, 정말 고마워
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 컴파일은 오류가 아니며 경고를 표시하지 않습니다. 그러나 무언가가 반응이 비어 있습니다.

그 후, 나는이 기사를 찾은 구글 검색

Struct Types and Struct Type Literals Article 그때 ... 코드를 편집하려고합니다.

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

Yapp, 나는 더 많은 세부 사항을 추가합니다.
수퍼 업
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.