diff --git a/.gitignore b/.gitignore index 5b90e79..c1ba03e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,8 @@ *.dll *.so *.dylib +main +json-study # Test binary, built with `go test -c` *.test diff --git a/arq.json b/arq.json new file mode 100644 index 0000000..955dd59 --- /dev/null +++ b/arq.json @@ -0,0 +1,15 @@ +{ + "name":"Project JSON", + "number": 5.43, + "integer": 7, + "objs": [ + { + "id": 1, + "name":"Nome 1" + }, + { + "id": 2, + "name":"Nome 2" + } + ] +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f7af791 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module json-study + +go 1.26.3 diff --git a/main.go b/main.go new file mode 100644 index 0000000..7402bc6 --- /dev/null +++ b/main.go @@ -0,0 +1,46 @@ +package main + +import ( + "encoding/json" + "fmt" // Este pacote contém funções para ecoar no terminal + "os" +) + +func main() { + var dados map[string]any + + data, err := os.ReadFile("arq.json") + if err != nil { + panic(err) + } + + err = json.Unmarshal(data, &dados) + if err != nil { + panic(err) + } + + for chave, valor := range dados { + switch v := valor.(type) { + case string: + fmt.Printf("Chave: %s (String) -> %s\n", chave, v) + case float64: + fmt.Printf("Chave: %s (Número) -> %.2f\n", chave, v) + case bool: + fmt.Printf("Chave: %s (Bool) -> %v\n", chave, v) + case []any: + fmt.Printf("Chave: %s (Array) -> \n", chave) + for i, item := range v { + fmt.Printf(" Item %d: %v\n", i, item) + } + default: + fmt.Printf("Chave: %s (Tipo desconhecido) -> %v\n", chave, v) + } + } + + // O recurso da linha abaixo chama-se: + // type assertion (é bom estudar isso). var.(type) + var inteiro int = int(dados["integer"].(float64)) + + fmt.Println("Mesmo que o valor seja inteiro, json.Unmarshal() lê como int64") + fmt.Printf("Valor de integer como inteiro: %d\n", inteiro) +}