Source File: ex25/main.go

package main

import (
	"encoding/json"
	"encoding/xml"
	"fmt"
	"log"
	"os"
)

type Ingredient struct {
	Name   string
	Amount int
}

type Money struct {
	Dollars int `json:"dollars"`
	Cents   int `json:"cents"`
}

type Cake struct {
	Name        string       `json:"name"`
	Ingredients []Ingredient `json:"ingredients"`
	Description string       `json:"description"`
	Price       Money        `json:"price"`
}

func main() {
	choco := Cake{
		"Chocolate",
		[]Ingredient{
			Ingredient{"Chocolate", 1},
			Ingredient{"Butter", 2},
			Ingredient{"Flour", 2},
			Ingredient{"Eggs", 4},
		},
		"A really good chocolate cake.",
		Money{30, 99},
	}

	json_data, err := json.MarshalIndent(choco, "", "  ")
	if err != nil { log.Fatal(err) }

	err = os.WriteFile("output.json", json_data, 0644)
	if err != nil { log.Fatal(err) }

	again_data, err := os.ReadFile("output.json")
	if err != nil { log.Fatal(err) }

	if !json.Valid(again_data) {
		log.Fatal("invalid json data")
	}

	var new_cake Cake
	err = json.Unmarshal(again_data, &new_cake)
	if err != nil { log.Fatal(err) }

	fmt.Println(new_cake)

    xml_out, err := xml.MarshalIndent(choco, "", "  ")
    if err != nil { log.Fatal(err) }

    // this will output raw, try adding xml:"" tags like json
    fmt.Println(string(xml_out))
}