package
0.0.0-20240927143213-b11bb4fab650
Repository: https://github.com/jocelynh1110/go-practice.git
Documentation: pkg.go.dev

# README

11-3-4 有排版的 JSON 編碼結果

Marshal() 產生的 JSON 字串通通擠在一起,沒有縮排換行,當資料龐大時就不太容易閱讀。

  • 使用 MarshalIndent() 函式,作用跟 Marshal() 幾乎一樣,只差會縮排和換行:
func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error)

prefix 參數:是要放在每一行開頭的前綴詞。 indent 參數:縮排文字,例如幾個空格或其他字元。

package main

import (
	"encoding/json"
	"fmt"
)

type person struct {
	LastName  string  `json:"lname"`
	FirstName string  `json:"fname"`
	Address   address `json:"address"`
}

type address struct {
	Street  string `json:"street"`
	City    string `json:"city"`
	State   string `json:"state"`
	ZipCode int    `json:"zipcode"`
}

func main() {
	// 建立要用來編碼 JSON 的資料結構
	addr := address{
		Street:  "Daan Road",
		City:    "Taipei",
		State:   "Taiwan",
		ZipCode: 106,
	}
	p := person{
		LastName:  "Miller",
		FirstName: "Kevin",
		Address:   addr, // 嵌入結構
	}

	// 編碼 JSON 資料但不排版
	noPrettyPrint, err := json.Marshal(p)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(noPrettyPrint))
	fmt.Println()

	// 編碼 JSON 資料並排版
	PrettyPrint, err := json.MarshalIndent(p, "", "\t")
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(string(PrettyPrint))
}

顯示結果:

{"lname":"Miller","fname":"Kevin","address":{"street":"Daan Road","city":"Taipei","state":"Taiwan","ZipCode":106}}

{
	"lname": "Miller",
	"fname": "Kevin",
	"address": {
		"street": "Daan Road",
		"city": "Taipei",
		"state": "Taiwan",
		"ZipCode": 106
	}
}

練習、產生學生選課資料,然後轉成 JSON 格式傳給學生

package main

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

type student struct {
	StudentId     int      `json:"id"`
	LastName      string   `json:"lname"`
	MiddleInitial string   `json:"minitial,omitempty"`
	FirstName     string   `json:"fname"`
	IsEnrolled    bool     `json:"enrolled"`
	Courses       []course `json:"classes,omitempty"`
}

type course struct {
	Name   string `json:"coursename"`
	Number int    `json:"coursenum"`
	Hours  int    `json:"coursehours"`
}

func main() {
	// 第一位學生資料,沒有課程資料,Courses 欄位為空值,故會被略過。
	s := student{
		StudentId:     1,
		LastName:      "Miller",
		MiddleInitial: "a",
		FirstName:     "Jay",
		IsEnrolled:    false,
	}

	// 編碼成 JSON ,縮排為 4 個空格
	student1, err := json.MarshalIndent(s, "", "    ")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	fmt.Println(string(student1))
	fmt.Println()

	// 第二位學生資料,沒有中間名
	s2 := student{
		StudentId:  2,
		LastName:   "Julia",
		FirstName:  "Jane",
		IsEnrolled: true,
	}

	// 第二位學生選課資料
	c := course{Name: "English", Number: 102, Hours: 2}
	s2.Courses = append(s2.Courses, c)
	c = course{Name: "History", Number: 201, Hours: 2}
	s2.Courses = append(s2.Courses, c)
	c = course{Name: "Math", Number: 301, Hours: 3}
	s2.Courses = append(s2.Courses, c)

	student2, err := json.MarshalIndent(s2, "", "    ")
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	fmt.Println(string(student2))
}

顯示結果:

{
    "id": 1,
    "lname": "Miller",
    "minitial": "a",
    "fname": "Jay",
    "enrolled": false
}

{
    "id": 2,
    "lname": "Julia",
    "fname": "Jane",
    "enrolled": true,
    "classes": [
        {
            "coursename": "English",
            "coursenum": 102,
            "coursehours": 2
        },
        {
            "coursename": "History",
            "coursenum": 201,
            "coursehours": 2
        },
        {
            "coursename": "Math",
            "coursenum": 301,
            "coursehours": 3
        }
    ]
}