O robusto pacote encoding/json
do Go simplifica a conversão de structs Go em JSON, um aspecto crucial da serialização de dados, interações de API e gerenciamento de arquivos de configuração. Este guia explora técnicas eficientes para lidar com vários cenários, incluindo structs básicas, estruturas aninhadas e formatação JSON personalizada.
Sumário
- Conversão Básica de Struct para JSON
- Lidando com Structs Aninhadas
- Controlando a Formatação da Saída JSON
- Tratamento Robusto de Erros
Conversão Básica de Struct para JSON
Converter uma struct Go simples para JSON é simples usando a função json.Marshal()
. Vamos ilustrar com um exemplo básico:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
person := Person{Name: "John Doe", Age: 30}
jsonData, err := json.Marshal(person)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(jsonData))
}
As tags json:"name"
e json:"age"
mapeam os campos da struct para as chaves JSON. json.Marshal()
retorna um slice de bytes, que convertemos para uma string. Crucialmente, sempre verifique se há erros.
Lidando com Structs Aninhadas
A elegância de json.Marshal()
se estende a structs aninhadas. Considere este exemplo:
package main
import (
"encoding/json"
"fmt"
)
type Address struct {
Street string `json:"street"`
City string `json:"city"`
}
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
Address Address `json:"address"`
}
func main() {
address := Address{Street: "123 Main St", City: "Anytown"}
person := Person{Name: "Jane Doe", Age: 25, Address: address}
jsonData, err := json.Marshal(person)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(jsonData))
}
json.Marshal()
lida recursivamente com estruturas aninhadas, criando a hierarquia JSON apropriada.
Controlando a Formatação da Saída JSON
Para melhor legibilidade, especialmente com estruturas complexas, use json.MarshalIndent()
:
package main
import (
"encoding/json"
"fmt"
)
// ... (structs Person e Address dos exemplos anteriores) ...
func main() {
// ... (variável person dos exemplos anteriores) ...
jsonData, err := json.MarshalIndent(person, "", " ")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println(string(jsonData))
}
O segundo argumento é a string de indentação (aqui, dois espaços). Isso produz uma saída JSON bem formatada.
Tratamento Robusto de Erros
Sempre incorpore um tratamento abrangente de erros. Os exemplos acima demonstram uma abordagem básica; em código de produção, considere um gerenciamento de erros mais sofisticado, potencialmente incluindo log e tipos de erro personalizados.
Este guia abrangente o equipa com o conhecimento para converter eficientemente structs Go em JSON, gerenciando várias complexidades com graça e precisão. Lembre-se que o tratamento adequado de erros é fundamental para aplicações robustas.