Welcome to our comprehensive guide on working with JSON (JavaScript Object Notation) in Go! JSON is a lightweight data interchange format that is easy for humans to read and write and easy for machines to parse and generate. Let's dive in!
JSON is a common data format with diverse uses in web development and other software applications. In Go, we can easily work with JSON data using built-in packages like encoding/json.
encoding/json? 📝The encoding/json package provides functions for encoding and decoding Go values to and from JSON text. It's the primary tool for JSON handling in Go.
Here's a simple example of creating JSON from a Go struct:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
p := Person{Name: "John Doe", Age: 30}
jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData))
}In this example, we defined a Person struct with two fields: Name and Age. We marked these fields with the json:"name/age" tags, which specify the JSON property name for each field. The json.Marshal() function converts our Person struct to JSON.
To parse JSON data into a Go struct, we can use the json.Unmarshal() function:
package main
import (
"encoding/json"
"fmt"
)
type Person struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
jsonData := []byte(`{"name":"Jane Doe","age":28}`)
var p Person
json.Unmarshal(jsonData, &p)
fmt.Println(p)
}In this example, we provided JSON data as a byte array (jsonData). We then created an instance of the Person struct (p) and used json.Unmarshal() to parse the JSON data into that struct.
For making REST API requests with JSON data, Go's net/http package comes in handy:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type User struct {
Name string `json:"name"`
}
func main() {
user := User{Name: "John Doe"}
jsonData, _ := json.Marshal(user)
resp, err := http.Post("https://api.example.com/user", "application/json", bytes.NewBuffer(jsonData))
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}In this example, we're making an HTTP POST request to an API, passing JSON data for a User object. We marshal the User object to JSON, set the request's content type to application/json, and read the response body to see the server's JSON response.
When receiving JSON from an API, we can parse it into Go structures in a similar way:
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type User struct {
Name string `json:"name"`
}
func main() {
resp, _ := http.Get("https://api.example.com/user")
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
var user User
json.Unmarshal(body, &user)
fmt.Println(user.Name)
}In this example, we're making an HTTP GET request to an API and parsing the JSON response into a User struct.
What is the purpose of the `json:"name"` tag in the `Person` struct?
That's it for our Go JSON Requests/Responses lesson! Now that you've learned the basics, you're ready to work with JSON data in your Go projects. Keep coding, and happy learning! 🚀💻🎉