Se você veio já criou um ou usou algum webservice baseado em REST, sabe a importância de trabalhar com JSON. Não há mistério algum neste formato de dados, se você tem alguma dúvida ou não conhece bem. Recomendo dar uma olhada neste link: Mozilla Glossary.
A forma de trabalhar com esses dados muda de acordo com a linguagem. Em Javascript é tão natural ler um JSON, que você pode interpretar o JSON como objeto sem nenhum esforço. Em Python e Ruby também não há muitas dificuldades. Mas em GoLang a forma de trabalhar com essa notação é um pouco diferente.
Vamos lá!
Primeiro, vamos levantar um server em Go para gerar os dados em JSON. Uma simples rota com uma resposta estática de um JSON deve bastar:
package main
import (
"net/http"
)
func Desenvolvedores(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
jsonStr := `[{"Nome":"Raphael","Idade":19,"Especialidade":"JavaScript"},
{"Nome":"Gabriel","Idade":24,"Especialidade":"GoLang"},
{"Name":"Marco","Idade":23,"Especialidade":"BitCoin"}]`
w.Write([]byte(jsonStr))
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/devs", Desenvolvedores)
http.ListenAndServe(":5000", mux)
}
Dê um build e rode o programa em background.
Abra seu navegador em ‘127.0.0.1:5000/devs’ e deve retornar:
[
{Nome: "Raphael",Idade: 19, Especialidade: "JavaScript"},
{Nome: "Gabriel", Idade: 24, Especialidade: "GoLang"},
{Name: "Marco", Idade: 23, Especialidade: "BitCoin"}
]
Agora vamos escrever um client que faça um request dos dados em JSON e converta isso em uma struct:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type Desenvolvedor struct {
Nome string
Idade int
Especialidade string
}
func main() {
// A url irá retornar:
// [
// {Nome: "Raphael",Idade: 19, Especialidade: "JavaScript"},
// {Nome: "Gabriel", Idade: 24, Especialidade: "GoLang"},
// {Name: "Marco", Idade: 23, Especialidade: "BitCoin"}
// ]
url := "http://127.0.0.1:5000/devs"
response, erro := http.Get(url)
if erro != nil {
panic(erro)
}
// lendo o json do response do http request
responseJson, erro := ioutil.ReadAll(response.Body)
if erro != nil {
panic(erro)
}
var dadosJson []Desenvolvedor
erro = json.Unmarshal(responseJson, &dadosJson) // aqui acontece a magica!
if erro != nil {
panic(erro)
}
// testando a estrutura de dados
fmt.Println(dadosJson)
}
Se tudo ir bem, quando executar o client.go você deve receber essa linha:
[{Raphael 19 JavaScript} {Gabriel 24 GoLang} { 23 BitCoin}]
Uma boa referência para projetos mais complexos e avançados é a documentação oficial dos pacotes de Json e http do Go. Esse artigo é baseado em um artigo da socketloop; “Golang : Unmarshal JSON from http response”.
Isso é tudo, galera! A ideia era mostrar como é fácil trabalhar com JSON em Go. Se você tiver qualquer crítica, dúvida ou sugestão sobre o artigo ou a aplicação do código, será bastante bem vinda.



