json.Marshal (struct) retorna "{}"

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

Aqui está a saída:

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

Por que o JSON é essencialmente vazio?

Doug Knesek
fonte

Respostas:

233

Você precisa exportar os campos no TestObject colocando em maiúscula a primeira letra no nome do campo. Mude kindpara Kinde assim por diante.

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

O pacote de codificação / json e pacotes semelhantes ignoram os campos não exportados.

As `json:"..."`strings que seguem as declarações de campo são tags struct . As tags nessa estrutura definem os nomes dos campos da estrutura ao empacotar para e do JSON.

playground

Muffin Top
fonte
não é suposto haver "espaço" antes "omitempty"
Damon
Posso fazer com letra minúscula?
user123456
Se você deseja marcar com letra minúscula, os campos stackoverflow.com/questions/21825322/…
user123456
1
@ user123456 Defina o nome do campo JSON como um nome em minúsculas usando a jsontag de campo (conforme descrito no último parágrafo desta resposta).
Muffin Top
28
  • Quando a primeira letra é maiúscula , o identificador é público para qualquer parte do código que você deseja usar.
  • Quando a primeira letra é minúscula , o identificador é privado e só pode ser acessado dentro do pacote em que foi declarado.

Exemplos

 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
fonte
3
homem impressionante, perfeito trabalho só mudam primeira carta a UPPER CASE, muito obrigado
vuhung3990
2
Exatamente In Go, a name is exported if it begins with a capital letter. Para contextualizar, visite este tour Go Basics
Mohsin
3

Em golang

em struct a primeira letra deve estar em maiúsculas ex. phonenumber -> PhoneNumber

======= Adicionar detalhes

Primeiro, eu estou tentando codificar assim

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

compilação golang não é erro e não mostra aviso. Mas a resposta está vazia porque algo

Depois disso, eu pesquisei no google encontrei este artigo

Tipos de estrutura e literais de tipo de estrutura Artigo então ... Eu tento editar código.

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

É trabalho.

Espero ajuda.

superup
fonte
1
adicionar mais detalhes
Basil
Yapp, eu adiciono mais detalhes.
superup