Descubra como criar e converter Structs em Go para JSON ou XML. Aprenda a manipular dados facilmente com exemplos prรกticos.
Tempo de Leitura: 5 minutos
Olรก. Dando continuidade ao artigo anterior, hoje irei abordar a criaรงรฃo de Structs em Go e como podemos, facilmente, converter seus dados para saรญdas em JSON ou XML.
Para aqueles que jรก vem da linguagem C jรก estรก acostumado com esse tipo de abordagem.
Definiรงรฃo de Struct:
Em Go, uma "struct" (abreviaรงรฃo de structure) รฉ um tipo de dados composto que agrupa campos de dados com tipos diferentes sob um รบnico nome. As structs sรฃo uma maneira de criar tipos de dados personalizados e mais complexos, organizando dados relacionados em uma รบnica unidade. Uma struct em Go envolve usar a palavra-chave type seguida pelo nome da struct, uma lista de campos e seus tipos associados. Aqui estรก um exemplo simples:
package main import "fmt" // Definiรงรฃo de uma struct chamada "Pessoa" type Pessoa struct { Nome string Idade int Sexo string } func main() { // Criando uma instรขncia da struct "Pessoa" pessoa1 := Pessoa{ Nome: "Joรฃo", Idade: 25, Sexo: "Masculino", } // Acessando os campos da struct fmt.Println("Nome:", pessoa1.Nome) fmt.Println("Idade:", pessoa1.Idade) fmt.Println("Sexo:", pessoa1.Sexo) }
Ao executar o retorno serรก:
- Nome: Joรฃo
- Idade: 25
- Sexo: Masculino
Fรกcil nรฉ?
Vamos fazer nesse exemplo retornar um JSON e apรณs um XML, para isso precisamos definir algumas modificaรงรตes na nossa estrutura.
Agoram, vamos nomear cada propriedade da estrutura a nomenclatura que ficarรก o JSON, ex.:
// Definiรงรฃo de uma struct chamada "Pessoa" type Pessoa struct { Nome string `json:"nome"` Idade int `json:"idade"` Sexo string `json:"sexo"` }
Isso รฉ importante para que o programa entenda qual os elementos que compรตem o JSON tanto na entrada quanto na saรญda dos dados.
Finalizando vamos usar a biblioteca JSON, nativa no Go, importando a biblioteca "encoding/json" e usar o mรฉtodo Marshal.ย
O cรณdigo ficarรก assim:
package main import ( "encoding/json" "fmt" ) // Definiรงรฃo de uma struct chamada "Pessoa" type Pessoa struct { Nome string `json:"nome"` Idade int `json:"idade"` Sexo string `json:"sexo"` } func main() { // Criando uma instรขncia da struct "Pessoa" pessoa1 := Pessoa{ Nome: "Joรฃo", Idade: 25, Sexo: "Masculino", } // Criando o arquivo JSON a partir de pessoa1 jsonData, err := json.Marshal(&pessoa1) if err != nil { fmt.Println(err.Error()) } // Acessando JSON da struct fmt.Println(string(jsonData)) }
Apรณs executar vocรช terรก o retorno:
{"nome":"Joรฃo","idade":25,"sexo":"Masculino"}
Com poucas linhas de cรณdigo conseguimos retornar um JSON com os dados passados para a nossa estrutura.ย
Agora digamos que precisamos que seja retornado um XML desses dados, a maneira รฉ bem similar.
Mas para definir um retorno em XML utilizaremos a biblioteca "encoding/xml" e criar algumas alteraรงรตes em nossa estrutura para o XML receber um atributo e que as suas tags fiquem corretas:
// Definiรงรฃo de uma struct chamada "Pessoa" type Pessoa struct { XMLName xml.Name `xml:"pessoa"` Tipo string `xml:"tipo,attr"` Nome string `xml:"nome"` Idade int `xml:"idade"` Sexo string `xml:"sexo"` }
Entรฃo o cรณdigo ficarรก assim:
package main import ( "encoding/xml" "fmt" ) // Definiรงรฃo de uma struct chamada "Pessoa" type Pessoa struct { XMLName xml.Name `xml:"pessoa"` Tipo string `xml:"tipo,attr"` Nome string `xml:"nome"` Idade int `xml:"idade"` Sexo string `xml:"sexo"` } func main() { // Criando uma instรขncia da struct "Pessoa" pessoa1 := Pessoa{ Tipo: "Pessoa1", Nome: "Joรฃo", Idade: 25, Sexo: "Masculino", } // Criando o arquivo XML a partir de pessoa1 xmlData, err := xml.Marshal(&pessoa1) if err != nil { fmt.Println(err.Error()) } // Acessando XML da struct fmt.Println(string(xmlData)) }
Ao executar terรก o seguinte retorno:
<pessoa tipo="Pessoa1">
<nome>Joรฃo</nome><idade>25</idade><sexo>Masculino</sexo>
</pessoa>
A diferenรงa รฉ que foram criadas uma tag para a entidade pessoa e mais um atributo para informar a Pessoa1.
Agora vamos fazer o contrรกrio.
Enviaremos um JSON e depois enviar um XML, quando enviados eles terรฃo que alimentar a nossa estrutura e ela irรก devolver os atributos.
Para isso, tanto o JSON quanto o XML irรฃo usar o mรฉtodo Unmarshal das suas respectivas bibliotecas.
Exemplo com o XML:
package main import ( "encoding/xml" "fmt" ) // Definiรงรฃo de uma struct chamada "Pessoa" type Pessoa struct { XMLName xml.Name `xml:"pessoa"` Tipo string `xml:"tipo,attr"` Nome string `xml:"nome"` Idade int `xml:"idade"` Sexo string `xml:"sexo"` } func main() { // Criando uma variavel pessoa1 da Struct Pessoa var pessoa1 Pessoa //Passando o XML em uma variavel; xmlData := `<pessoa tipo="Pessoa1"><nome>Joรฃo</nome><idade>25</idade><sexo>Masculino</sexo></pessoa>` //passando os dados do XML para a pessoa1 if err := xml.Unmarshal([]byte(xmlData), &pessoa1); err != nil { fmt.Println(err.Error()) } // Acessando os campos da struct fmt.Println("Nome:", pessoa1.Nome) fmt.Println("Idade:", pessoa1.Idade) fmt.Println("Sexo:", pessoa1.Sexo) }
Ao executar terรก o seguinte retorno:
- Nome: Joรฃo
- Idade: 25
- Sexo: Masculino
Com os dados vindo de um XML, aqui passei via string, mas poderia vir de um arquivo, alimentou a nossa estrutura e alimentou as suas propriedades.
O mesmo com JSON, sรณ devemos fazer algumas mudanรงas de biblioteca e a chamada na struct Pessoa:
package main import ( "encoding/json" "fmt" ) // Definiรงรฃo de uma struct chamada "Pessoa" type Pessoa struct { Nome string `json:"nome"` Idade int `json:"idade"` Sexo string `json:"sexo"` } func main() { // Criando uma variavel pessoa1 da Struct Pessoa var pessoa1 Pessoa //Passando o JSON em uma variavel; jsonData := `{"nome":"Joรฃo","idade":25,"sexo":"Masculino"}` //passando os dados do JSON para a pessoa1 if err := json.Unmarshal([]byte(jsonData), &pessoa1); err != nil { fmt.Println(err.Error()) } // Acessando os campos da struct fmt.Println("Nome:", pessoa1.Nome) fmt.Println("Idade:", pessoa1.Idade) fmt.Println("Sexo:", pessoa1.Sexo) }
Novamente passei direto pela propriedade string, mas poderรก ser enviada de um arquivo tambรฉm. E no final teremos o mesmo resultado:
- Nome: Joรฃo
- Idade: 25
- Sexo: Masculino
Para finalizar esse artigo, agora teremos a seguinte situaรงรฃo. Vamos passar um JSON e retornar um XML e depois passar um XML e retornar um JSON. Isso รฉ interessante para quem precisar fazer conversรตes entre esses dois tipos de arquivos.
JSON para XML:
package main import ( "encoding/json" "encoding/xml" "fmt" ) // Definiรงรฃo de uma struct chamada "Pessoa" type Pessoa struct { xml.Name `json:"-" xml:"pessoa"` Tipo string `json:"tipo" xml:"tipo,attr"` Nome string `json:"nome" xml:"nome"` Idade int `json:"idade" xml:"idade"` Sexo string `json:"sexo" xml:"sexo"` } func main() { // Criando uma variavel pessoa1 da Struct Pessoa var pessoa1 Pessoa //Passando o JSON em uma variavel; jsonData := `{"tipo":"Pessoa1","nome":"Joรฃo","idade":25,"sexo":"Masculino"}` //passando os dados do JSON para a pessoa1 if err := json.Unmarshal([]byte(jsonData), &pessoa1); err != nil { fmt.Println(err.Error()) } // Criando o arquivo XML a partir de pessoa1 xmlData, err := xml.Marshal(&pessoa1) if err != nil { fmt.Println(err.Error()) } // Acessando XML da struct fmt.Println(string(xmlData)) }
Retorno:
<pessoa tipo="Pessoa1">
<nome>Joรฃo</nome><idade>25</idade><sexo>Masculino</sexo>
</pessoa>
XML para JSON:
package main import ( "encoding/json" "encoding/xml" "fmt" ) // Definiรงรฃo de uma struct chamada "Pessoa" type Pessoa struct { xml.Name `json:"-" xml:"pessoa"` Tipo string `json:"tipo" xml:"tipo,attr"` Nome string `json:"nome" xml:"nome"` Idade int `json:"idade" xml:"idade"` Sexo string `json:"sexo" xml:"sexo"` } func main() { // Criando uma variavel pessoa1 da Struct Pessoa var pessoa1 Pessoa //Passando o XML em uma variavel; xmlData := `<pessoa tipo="Pessoa1"><nome>Joรฃo</nome><idade>25</idade><sexo>Masculino</sexo></pessoa>` //passando os dados do XML para a pessoa1 if err := xml.Unmarshal([]byte(xmlData), &pessoa1); err != nil { fmt.Println(err.Error()) } // Criando o arquivo JSON a partir de pessoa1 jsonData, err := json.Marshal(&pessoa1) if err != nil { fmt.Println(err.Error()) } // Acessando JSON da struct fmt.Println(string(jsonData)) }
Retorno:
{"tipo":"Pessoa1","nome":"Joรฃo","idade":25,"sexo":"Masculino"}
Esse foi um exemplo bem simples de como utilizar, manipular dados de JSON e XML e de conversรฃo de dados. Existem vรกrias opรงรตes de utilizar essa abordagem, mas tentei criar uma maneira mais fรกcil de como entender a trabalhar com esses arquivos.
Fico por aqui, agradeรงo quem leu atรฉ o final e seguiu os exemplos, aguardem para mais prรณximos artigos.