This tutorial aims to guide you through the process of parsing JSON data from a string and generating JSON data from Go structs. By the end of this tutorial, you will have a solid understanding of how to work with JSON in Go.
JSON (JavaScript Object Notation) is a lightweight data-interchange format that is easy for humans to read and write and easy for machines to parse and generate. Go provides built-in support for JSON encoding and decoding.
In Go, the encoding/json package provides functionality to work with JSON data. To parse JSON data, you can use the json.Unmarshal function. This function takes two arguments: the JSON data to parse and a reference to the variable where the parsed data should be stored.
Here's an example:
package main
import (
    "encoding/json"
    "fmt"
)
type Person struct {
    Name string 
    Age  int    
}
func main() {
    jsonData := `{"Name":"John", "Age":30}`
    var person Person
    json.Unmarshal([]byte(jsonData), &person)
    fmt.Println(person.Name, person.Age) // Output: John 30
}
To generate JSON data, you can use the json.Marshal function. This function takes one argument: the data you want to convert to JSON. json.Marshal returns the JSON encoding of the input value.
Here's an example:
package main
import (
    "encoding/json"
    "fmt"
)
type Person struct {
    Name string 
    Age  int    
}
func main() {
    person := Person{"John", 30}
    jsonData, _ := json.Marshal(person)
    fmt.Println(string(jsonData)) // Output: {"Name":"John","Age":30}
}
Let's look at a few more examples to better understand parsing and generating JSON data in Go.
package main
import (
    "encoding/json"
    "fmt"
)
type Person struct {
    Name string 
    Age  int    
}
func main() {
    jsonData := `[{"Name":"John", "Age":30}, {"Name":"Jane", "Age":25}]`
    var persons []Person
    json.Unmarshal([]byte(jsonData), &persons)
    for _, person := range persons {
        fmt.Println(person.Name, person.Age)
    }
    // Output: 
    // John 30
    // Jane 25
}
In the above example, we parse a JSON array into a slice of Person structs.
package main
import (
    "encoding/json"
    "fmt"
)
type Person struct {
    Name string 
    Age  int    
}
func main() {
    persons := []Person{{"John", 30}, {"Jane", 25}}
    jsonData, _ := json.Marshal(persons)
    fmt.Println(string(jsonData)) 
    // Output: [{"Name":"John","Age":30},{"Name":"Jane","Age":25}]
}
In the above example, we generate a JSON array from a slice of Person structs.
In this tutorial, we've learned how to parse and generate JSON data in Go. We have used the json.Unmarshal function to parse JSON data into Go structs and the json.Marshal function to generate JSON data from Go structs.
Next steps for learning could involve working with more complex JSON structures or learning about more advanced features of the encoding/json package. You might also want to explore other data formats that Go can work with.
Solution:
package main
import (
    "encoding/json"
    "fmt"
)
func main() {
    jsonData := `{"Name":"John", "Age":30}`
    var person map[string]interface{}
    json.Unmarshal([]byte(jsonData), &person)
    fmt.Println(person["Name"], person["Age"]) // Output: John 30
}
Solution:
package main
import (
    "encoding/json"
    "fmt"
)
func main() {
    person := map[string]interface{}{"Name": "John", "Age": 30}
    jsonData, _ := json.Marshal(person)
    fmt.Println(string(jsonData)) // Output: {"Age":30,"Name":"John"}
}
Solution:
package main
import (
    "encoding/json"
    "fmt"
)
type Person struct {
    Name string 
    Age  int    
    Address struct {
        Street string
        City   string
    }
}
func main() {
    jsonData := `{"Name":"John", "Age":30, "Address": {"Street": "123 Main St", "City": "New York"}}`
    var person Person
    json.Unmarshal([]byte(jsonData), &person)
    fmt.Println(person.Name, person.Age, person.Address.Street, person.Address.City) 
    // Output: John 30 123 Main St New York
}
Solution:
package main
import (
    "encoding/json"
    "fmt"
)
type Person struct {
    Name string 
    Age  int    
    Address struct {
        Street string
        City   string
    }
}
func main() {
    person := Person{
        Name: "John",
        Age:  30,
        Address: struct {
            Street string
            City   string
        }{
            Street: "123 Main St",
            City:   "New York",
        },
    }
    jsonData, _ := json.Marshal(person)
    fmt.Println(string(jsonData)) 
    // Output: {"Name":"John","Age":30,"Address":{"Street":"123 Main St","City":"New York"}}
}
Remember to always practice with different JSON structures and scenarios to become more proficient in parsing and generating JSON in Go.