1. 程式人生 > >GO語言開發之JSON處理 編碼JSON 與 解碼JSON

GO語言開發之JSON處理 編碼JSON 與 解碼JSON

1. json簡介

JSON (JavaScript Object Notation)是一種比XML更輕量級的資料交換格式,在易於人們閱讀和編寫的同時,也易於程式解析和生成。儘管JSON是JavaScript的一個子集,但JSON採用完全獨立於程式語言的文字格式,且表現為鍵/值對集合的文字描述形式(類似一些程式語言中的字典結構),這使它成為較為理想的、跨平臺、跨語言的資料交換語言。

開發者可以用 JSON 傳輸簡單的字串、數字、布林值,也可以傳輸一個數組,或者一個更復雜的複合結構。在 Web 開發領域中, JSON被廣泛應用於 Web 服務端程式和客戶端之間的資料通訊。

Go語言內建對JSON的支援。使用Go語言內建的encoding/json 標準庫,開發者可以輕鬆使用Go程式生成和解析JSON格式的資料。

2. json編碼

使用json.Marshal()函式可以對一組資料進行JSON格式的編碼。

func Marshal(interface{}) ([]byte, error)

MarshalIndent 很像 Marshal,只是用縮排對輸出進行格式化

func MarshalIndent(interface{}, prefix, indent string) ([]byte, error)

package main

import (
	"encoding/json"
	"fmt"
)

type IT struct{
	Name string
	Company string
	Subjects []string
	IsOk bool
	Price float64
}

func main()

	t1 := IT{"Ternence Hsu","Google", []string{"Go", "C++", "Python", "Test"}, true,666.666}

	//生成一段JSON 格式的文字
	//如果編碼成功, err 將賦於零值 nil,變數b 將會是一個進行JSON 格式化之後的[]byte 型別
	b1, err := json.Marshal(t1)
	if err != nil {
		fmt.Println("json err:", err)
	}
	
	// 用縮排對輸出進行格式化
	b2, err := json.MarshalIndent(t1, "", "    ")
	if err != nil {
		fmt.Println("json err:", err)
	}

	fmt.Println(string(b1))
	fmt.Println(string(b2))
}

	/*
		b1輸出結果:
		{"Name":"Ternence Hsu","Company":"Google","Subjects":["Go","C++","Python","Test"],"IsOk":true,"Price":666.666}

		b2 輸出結果:
		{
			"Name":"Ternence Hsu",
			"Company":"Google",
			"Subjects":[
				"Go",
				"C++",
				"Python",
				"Test"
			],
			"IsOk":true,
			"Price":666.666
		}
	*/

3. json解碼

使用json.Unmarshal()函式將JSON格式的文字解碼為Go裡面預期的資料結構

func Unmarshal(data []byte, v interface{}) error

package main

import (
	"encoding/json"
	"fmt"
)

type IT struct {
	Name  	 string   `json:"name"`
	Company  string   `json:"company"`
	Subjects []string `json:"subjects"`
	IsOk     bool     `json:"isok"`
	Price    float64  `json:"price"`
}
	
func main() {
	b := []byte(`{
	"name": "Ternence Hsu",
	"company": "Google",
	"subjects": [
		"Go",
		"C++",
		"Python",
		"Test"
	],
	"isok": true,
	"price": 666.666
}`)

	var t IT
	err := json.Unmarshal(b, &t)
	if err != nil {
		fmt.Println("json err:", err)
	}
	fmt.Println(t)
	//執行結果:{Ternence Hsu Google [Go C++ Python Test] true 666.666}

	//只想要Subjects欄位
	type IT2 struct {
		Subjects []string `json:"subjects"`
	}

	var t2 IT2
	err = json.Unmarshal(b, &t2)
	if err != nil {
		fmt.Println("json err:", err)
	}
	fmt.Println(t2)
	//執行結果:{[Go C++ Python Test]}
}