Pular para o conteúdo principal

victorstein.dev

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.