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.