Back-End

8 jun, 2015

Trabalhando com Json em Go

Publicidade

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.