21/100 Dias de Golang - JSON
Table of Contents
#
JSON
Vamos sair um pouco do assunto das goroutines e ir para uma coisa mais “tranquila”, vamos falar sobre JSON, especificamente no Golang. Vamos dar um exemplo inicial de como transformar uma struct em um JSON. Depois de 20 dias, estou mais acostumado com a sintaxe do Go, espero que você também esteja.
package main
import "encoding/json"
type Animal struct {
NomeCientifico string
NomePopular string
Patas int
NaturalDoBrasil bool
}
func main() {
caramelo := Animal{
NomeCientifico: "Caramelus Brasiliensis",
NomePopular: "Caramelo",
Patas: 4,
NaturalDoBrasil: true,
}
res, err := json.Marshal(caramelo)
if err != nil {
println(err)
}
println(res)
}
A parte nova desse programa é a parte da serialização da struc para JSON. Fazemos isso com a função res, err := json.Marshal(caramelo)
. A função json.Marshal
retorna um ([]byte, error)
. Perceba que é retornado um slice de bytes, rodando esse programa temos a seguinte saída:
go run main.go
[101/112]0xc000074070
Para vermos o conteúdo em string temos que fazer a transformação de forma explícita:
println(string(res))
Saída:
{"NomeCientifico":"Caramelus Brasiliensis","NomePopular":"Caramelo","Patas":4,"NaturalDoBrasil":true}
Só por curiosidade, o termo “Marshal” vem do conceito de “marshalling”, que significa organizar ou preparar algo para transporte. Em computação, marshalling se refere ao processo de serializar dados (converter para um formato estruturado como JSON ou XML) para que possam ser armazenados ou enviados para outra parte do sistema.
#
Unmarshal
Agora faremos o processo contrário. Digamos que o script recebeu de uma API um JSON e queremos transformar em uma struct.
jsonDaWeb := []byte(`{"NomeCientifico":"Cyanocorax caeruleus","NomePopular":"Gralha-azul","Patas":2,"NaturalDoBrasil":true}`)
var gralhaAzul Animal
err = json.Unmarshal(jsonDaWeb, &gralhaAzul)
if err != nil {
println(err)
}
println(gralhaAzul.NomePopular)
A única diferença é que temos que criar uma variável, que vai receber esse JSON, e executar o err = json.Unmarshal(jsonDaWeb, &gralhaAzul)
passando o JSON e a referência para a variável criada.
#
Struct Tags
Agora imagine que a API que você estava recebendo o dado foi atualizada e agora eles estão enviando o nome dos campos de forma diferente, exemplo:
{"nc":"Cyanocorax caeruleus","np":"Gralha-azul","p":2,"ndb":true}
Como podemos tratar isso no script? Com struct tags
. Vamos adicionar na definição da struct:
type Animal struct {
NomeCientifico string `json:"nc"`
NomePopular string `json:"np"`
Patas int `json:"p"`
NaturalDoBrasil bool `json:"ndb"`
}
Struct tags são metadados associados a cada campo da struct. Elas fornecem instruções para bibliotecas ou pacotes que processam a struct, como o encoding/json e outros pacotes do Go.
Agora o json.Marshal()
vai conseguir serializar o JSON com esses nomes de chaves e o json.Unmarshal()
vai exibir o JSON com os mesmos nomes.
Agora o json.Marshal()
vai conseguir serializar o JSON com esses nomes de chaves e o json.Unmarshal()
vai exibir o JSON com os mesmos nomes.