A maioria dos aplicativos modernos requer comunicação entre vários serviços e JSON é uma das notações mais populares para armazenamento e transferência de dados pela web. Neste artigo, exploraremos o trabalho com JSON no Go, uma linguagem de código aberto popular.
Vamos começar!
Introdução ao JSON
JSON, ou JavaScript Object Notation , é um formato de texto popular para armazenamento, enviar e receber informações. JSON é fácil de escrever e entender devido à sua estrutura simples que é formatada como um par de valores-chave usando listas ordenadas.
O JSON é independente de linguagem, o que significa que pode ser usado com qualquer linguagem de programação. Muitas linguagens vêm com suporte integrado para JSON.
Vamos ver como é o formato JSON com um exemplo! No bloco de código abaixo, o objeto JSON representa um usuário em um aplicativo da web:
{“firstname”:”Mohit”,”lastname”:”Khare”,”id”:”mkfeuhrer”,”age”:”24″,”gender”:”male”,”preferred_topics”: [“startups”,”books”,”chess”,”blogging”],”social_links”: [{“site”:”twitter”,”url”:”https://twitter.com/mkfeuhrer”}]}
A chave JSON deve ser uma string baseada em como o JSON esquema de formato é definido. No entanto, o valor pode ser uma string, um objeto ou uma lista de strings ou objetos.
Lendo arquivos JSON no Go
Salve o objeto JSON do bloco de código acima em um arquivo chamado user.json. Usaremos ReadFile do ioutilpackage para ler o arquivo JSON e imprimir os dados:
package main import (“fmt””io/ioutil”) func ReadJSON (filename string) ([] byte, erro) {data , err:=ioutil.ReadFile (nome de arquivo) if err!=nil {fmt.Println (“Erro ao ler user.json”, err) return nil, err} fmt.Println (“Sucesso ao ler user.json”) dados de retorno, nil} func main () {data, err:=ReadJSON (“user.json”) if err!=nil {return} fmt.Println (“Content of user.json:”) fmt.Println (string (data)) }
A saída para o código acima é a seguinte:
Sucesso ao ler user.json Conteúdo de user.json: {“firstname”:”Mohit”,”lastname”:”Khare”,”id”:”mkfeuhrer”,”age”:”24″,”gender”:”male”,”preferred_topics”: [“startups”,”books”,”chess”],”social_links”: [{“site”:”twitter”,”url”:”https://twitter.com/mkfeuhrer”}]}
Decodificar JSON em estruturas Go
Agora isso podemos ler o arquivo JSON, vamos analisá-lo em estruturas Go. Você não pode executar operações Go diretamente em dados JSON. Em vez disso, você deve mapear os dados JSON para a estrutura Go, permitindo que ele execute outras operações.
pacote json em Go fornece a função Unmarshal, que nos ajuda a analisar dados em estruturas:
func Unmarshal (dados [] byte, v interface {}) erro
O Unmarshal requer que os dados estejam em uma matriz de bytes para analise-o para uma interface. Vamos criar uma estrutura para ler os dados do usuário definidos acima:
//analisar o tipo de objeto do link social SocialLink struct {Site string `json:”site”` URL string `json:”url”`}//analisar o objeto do usuário type User struct {Firstname string `json:”firstname”` Lastname string `json:”lastname”` ID string `json:”id”` Age string `json:”age”` Gender string `json:”gender”` PreferredTopics [] string `json:”preferred_topics”` SocialLinks [] SocialLink `json:”social_links”`}
Agora, analisaremos JSON para esta estrutura:
func DecodeJSON (data [] byte, usuário * Usuário) {err:=json.Unmarshal (dados, usuário) if err!=Nil {fmt.Println (“Erro ao analisar JSON”, err)} fmt.Println (* usuário)}//Chamamos esta função com os dados e objeto do usuário var user User DecodeJSON (data, & user)
Codificar JSON de estruturas Go
Também gostaríamos de escrever dados JSON a de nosso aplicativo Go, então vamos converter as estruturas que criamos em dados JSON. O pacote json de Go fornece a função Marshal para ajudar a codificar structs para dados JSON:
func Marshal (v interface {}) ([] byte, erro)
Marshal requer uma interface a partir da qual codificaremos os dados JSON. Vamos codificar nosso objeto User de volta para JSON:
func EncodeJSON (user * User) {data, err:=json.Marshal (user) if err!=Nil {fmt.Println (“Error parsing JSON”, err) } fmt.Println (string (data))}//Chamamos esta função com os dados e o usuário Object user:=User {Firstname:”John”, Lastname:”Doe”, ID:”john”, Age:”30″, Gênero:”masculino”, SocialLinks: [] SocialLink {{Site:”twitter”, URL:”https://twitter.com/john”,},},} EncodeJSON (dados, & usuário)
O função acima imprimirá os dados JSON:
{“firstname”:”John”,”lastname”:”Doe”,”id”:”john”,”age”:”30″,”gender”:”masculino”,”preferred_topics”: null,”social_links”: [{“site”:”twitter”,”url”:”https://twitter.com/john”}]}
Observe cuidadosamente que o campo preferred_topics é null porque nosso objeto de usuário não tinha um valor atribuído a este atributo. Agora, vamos aprender como podemos pular campos vazios.
Tags JSON no Go
Quando definimos structs, usamos algumas tags JSON. As tags nos ajudam a controlar a chave dos atributos, omitindo campos vazios ou nulos.
Vejamos um exemplo de tags! No bloco de código abaixo, definiremos o atributo Firstname para usar a chave”first name”em JSON. Omitiremos PreferredTopics do objeto se ele estiver vazio:
PreferredTopics [] string `json:”preferred_topics, omitempty”`
Simplesmente ignoraremos Age enquanto codificamos/decodificamos JSON.
Age int `json:”-“`
Normalmente usamos omitempty quando um valor é opcional em nossas estruturas. Em nosso exemplo de usuário, podemos gerenciar se o sobrenome do usuário não estiver presente, mas não podemos adicionar omitempty ao id.
Seu código concluído será semelhante ao seguinte bloco de código:
package main import (“encoding/json””fmt””io/ioutil”) type SocialLink struct {Site string `json:”site”` URL string `json:”url”`} type User struct {Firstname string `json:”firstname”`String de sobrenome` json:”lastname, omitempty”`string de ID` json:”id”`string de idade` json:”idade, omitempty”`string de gênero` json:”gênero, omitempty”`PreferredTopics [] string` json:”preferred_topics, omitempty”`SocialLinks [] SocialLink` json:”social_links, omitempty”`} func ReadJSON (string do nome do arquivo) ([] byte, erro) {data, err:=ioutil.ReadFile (filename) if err!=nil {fmt.Println (“Erro ao ler user.json”, err) return nil, err} fmt.Println (“Sucesso ao ler user.js on”) return data, nil} func DecodeJSON (data [] byte, user * User) {err:=json.Unmarshal (data, user) if err!=nil {fmt.Println (“Error parsing JSON”, err) } fmt.Println (* usuário)} func EncodeJSON (usuário * Usuário) {dados, errar:=json.Marshal (usuário) se errar!=nil {fmt.Println (“Erro ao analisar JSON”, err)} fmt.Println (string (dados))} func main () {data, err:=ReadJSON (“user.json”) if err!=nil {return} fmt.Println (“Content of user.json:”) fmt.Println ( string (data)) var user User fmt.Println (“\ nDecodificar os dados JSON para a estrutura do usuário:”) DecodeJSON (data, & user)//definir o novo usuário user2:=User {Firstname:”John”, Lastname:”Doe”, ID:”john”, Idade:”30″, Sexo:”masculino”, SocialLinks: [] SocialLink {{Site:”twitter”, URL:”https://twitter.com/john”,},}, } fmt.Println (“\ n Codificar struct para JSON:”) EncodeJSON (& user2)}
Conclusão
Neste tutorial, aprendemos como ler arquivos JSON, codificar e decodificar dados para structs usando as funções empacotar e descompactar e definir structs using tags.
Nosso exemplo incluiu campos simples para inserir as informações do perfil de um usuário, mas você pode usar as informações deste tutorial para construir uma série de aplicativos complexos.
Espero que você gostei do artigo e aprendi algo útil!