Go語(yǔ)言基礎(chǔ)Json序列化反序列化及文件讀寫(xiě)示例詳解

概述
JSON(JavaScript Object Notation,JavaScript對(duì)象表示法)是一種輕量級(jí)的、鍵值對(duì)的數(shù)據(jù)交換格式。結(jié)構(gòu)由大括號(hào)'{}',中括號(hào)'[]',逗號(hào)',',冒號(hào)';',雙引號(hào)'""'組成,包含的數(shù)據(jù)類(lèi)型有Object,Number,Boolean,String,Array, NULL等。
JSON序列化
將Go語(yǔ)言原數(shù)據(jù)轉(zhuǎn)換成JSON格式字符串
語(yǔ)法:
//傳map,結(jié)構(gòu)體,slice...,返回結(jié)果byte切片和error是否錯(cuò)誤
func Marshal(v interface{}) ([]byte, error)
結(jié)構(gòu)體轉(zhuǎn)JSON
type Person struct{
Name string//姓名
Age int //年齡
Sex rune//性別
Hobby []string //愛(ài)好
Money float64//錢(qián)
}
person:=Person{Name:"張三",Age:18,Sex:'男',Hobby:[]string{"聽(tīng)音樂(lè)","看書(shū)","打籃球"},Money:18.62}
if bytes,err:=json.Marshal(person);err!=nil{
fmt.Println("編碼錯(cuò)誤",err)
}else{
//{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽(tīng)音樂(lè)","看書(shū)","打籃球"],"Money":18.62}
fmt.Println("編碼成功:",string(bytes))
}
map轉(zhuǎn)JSON
p:=make(map[string]interface{},0)
p["0"]=map[string]interface{}{"name":"張三","age":18,"sex":'男',"hobby":[]string{"聽(tīng)音樂(lè)","看書(shū)","打籃球"},"money":18.62}
p["1"]=map[string]interface{}{"name":"李四","age":19,"sex":'女',"hobby":[]string{"聽(tīng)音樂(lè)","看電影","打足球"},"money":1.62}
if bytes,err:=json.Marshal(p);err!=nil{
fmt.Println("編碼錯(cuò)誤",err)
}else{
fmt.Println(string(bytes))
}
切片轉(zhuǎn)JSON
p:=make([]map[string]interface{},0)
p1:=map[string]interface{}{"name":"張三","age":18,"sex":'男',"hobby":[]string{"聽(tīng)音樂(lè)","看書(shū)","打籃球"},"money":18.62}
p2:=map[string]interface{}{"name":"李四","age":19,"sex":'女',"hobby":[]string{"聽(tīng)音樂(lè)","看電影","打足球"},"money":1.62}
p=append(p,p1,p2)
if bytes,err:=json.Marshal(p);err!=nil{
fmt.Println("編碼錯(cuò)誤",err)
}else{
fmt.Println(string(bytes))
}
JSON反序列化
將JSON格式字符串轉(zhuǎn)換成Go語(yǔ)言原數(shù)據(jù)
//傳入JSON字符串的byte字節(jié)和Go接收數(shù)據(jù)的類(lèi)型指針,返回err錯(cuò)誤,是否返回成功
func Unmarshal(data []byte, v interface{}) error
JSON轉(zhuǎn)map
str:=`{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽(tīng)音樂(lè)","看書(shū)","打籃球"],"Money":18.62}`
p:=make(map[string]interface{}, 0)
if err:=json.Unmarshal([]byte(str),&p);err!=nil{
fmt.Println("解碼失敗",err)
}else{
fmt.Println("解析成功",p)
}
JSON轉(zhuǎn)結(jié)構(gòu)體
str:=`{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽(tīng)音樂(lè)","看書(shū)","打籃球"],"Money":18.62}`
var p Person
if err:=json.Unmarshal([]byte(str),&p);err!=nil{
fmt.Println("解碼失敗",err)
}else{
fmt.Println("解析成功",p)
}
JSON轉(zhuǎn)切片
str:=`[{"Hobby":["聽(tīng)音樂(lè)","看書(shū)","打籃球"]}]`
p:=make([]map[string]interface{}, 0)
if err:=json.Unmarshal([]byte(str),&p);err!=nil{
fmt.Println("解碼失敗",err)
}else{
fmt.Println("解析成功",p)
}
寫(xiě)JSON文件
將Go語(yǔ)言源數(shù)據(jù)寫(xiě)入到j(luò)son文件
//第一步 傳文件的路徑,返回文件的可讀可寫(xiě),error:是否成功
//flag:文件標(biāo)識(shí):是創(chuàng)建還是,追加......
//parm:文件模式表示文件的模式和權(quán)限位,通常,請(qǐng)求的模式為 0666,它使該文件可由任何人讀和寫(xiě)
func OpenFile(name string, flag int, perm FileMode) (*File, error)
或者
func Create(name string) (*File, error) //傳入文件的名字,返回文件的對(duì)象和error是否成功
//第二步 傳文件對(duì)象,返回一個(gè)從w讀取的新編碼器
func NewEncoder(w io.Writer) *Encoder
//第三步 編碼器將v寫(xiě)入流中,后換行
func (enc *Encoder) Encode(v interface{}) error
map寫(xiě)入JSON文件
p:=make(map[string]interface{}, 0)
p["name"]="張三"
p["age"]=18
p["sex"]='男'
p["hobby"]=[]string{"聽(tīng)英語(yǔ)","看書(shū)"}
p["money"]=15.63
if distFile,err:=os.OpenFile("map.json",os.O_CREATE,0666);err!=nil{
fmt.Println("創(chuàng)建文件失敗",err)
}else {
enc:=json.NewEncoder(distFile)
if err:=enc.Encode(p);err!=nil {
fmt.Println("寫(xiě)入文件失敗", err)
}else{
fmt.Println("寫(xiě)入文件成功")
}
}
切片寫(xiě)入JSON文件
p:=make([]map[string]interface{}, 0)
p1:=map[string]interface{}{"name":"張三","age":18,"sex":'男',"hobby":[]string{"聽(tīng)書(shū)","看電視"},"money":15.84}
p2:=map[string]interface{}{"name":"李四","age":20,"sex":'女',"hobby":[]string{"打籃球","看書(shū)"},"money":125.84}
p=append(p,p1,p2)
if distFile,err:=os.OpenFile("slice.json",os.O_CREATE,0666);err!=nil{
fmt.Println("創(chuàng)建slice文件失敗", err)
}else {
enc:=json.NewEncoder(distFile)
if err:=enc.Encode(p);err!=nil{
fmt.Println("寫(xiě)入slice 文件失敗", err)
}else{
fmt.Println("寫(xiě)入slice 文件成功")
}
}
結(jié)構(gòu)體寫(xiě)入JSON文件
p:=Person{Name:"張三",Age:18,Sex:'男',Hobby:[]string{"聽(tīng)英語(yǔ)","讀書(shū)"},Money:15.35}
if distFile,err:=os.OpenFile("張三.json",os.O_CREATE|os.O_APPEND,0666);err!=nil{
fmt.Println("創(chuàng)建文件失敗",err)
}else{
enc:=json.NewEncoder(distFile)
if err:=enc.Encode(&p);err!=nil {
fmt.Println("寫(xiě)入文件失敗",err)
}else {
fmt.Println("寫(xiě)入文件成功")
}
}
讀JSON文件
將json文件轉(zhuǎn)換成Go語(yǔ)言源數(shù)據(jù)
//第一步 傳文件的路徑,返回文件的可讀可寫(xiě),error:是否成功
func Open(name string) (*File, error)
//第二步 傳文件對(duì)象,返回一個(gè)從r讀取的新解碼器
func NewDecoder(r io.Reader) *Decoder
//第三步 解碼器將值存儲(chǔ)在v值中
func (dec *Decoder) Decode(v interface{}) error
解碼JSON文件為map
p:=make(map[string]interface{}, 0)
if srcFile,err:=os.Open("map.json");err!=nil{
fmt.Println("打開(kāi)map 文件失敗",err)
}else{
en:=json.NewDecoder(srcFile)
if err:=en.Decode(&p);err!=nil{
fmt.Println("讀入map 文件失敗",err)
}else {
fmt.Println("讀取map 文件成功",p)
}
}
解碼JSON文件為切片
p:=make([]map[string]interface{}, 0)
if srcFile,err:=os.Open("slice.json");err!=nil{
fmt.Println("打開(kāi)slice 文件失敗", err)
}else{
en:=json.NewDecoder(srcFile)
if err:=en.Decode(&p);err!=nil{
fmt.Println("讀入slice 文件失敗", err)
}else {
fmt.Println("讀取slice 文件成功", p)
}
}
解碼JSON文件為結(jié)構(gòu)體
var p =new(Person)
if srcFile,err:=os.Open("struct.json");err!=nil{
fmt.Println("打開(kāi)struct 文件失敗", err)
}else{
en:=json.NewDecoder(srcFile)
if err:=en.Decode(&p);err!=nil{
fmt.Println("讀入struct 文件失敗", err)
}else{
fmt.Println("讀取struct 文件成功", *p)
}
}
示例
package main
import (
"encoding/json"
"fmt"
"os"
)
type Person struct {
Name string//姓名
Ageint//年齡
Sexrune //性別
Hobby []string //愛(ài)好
Money float64 //錢(qián)
}
func main() {
fmt.Println("---------------JSON序列化----------")
//JSON序列化
//結(jié)構(gòu)體
marshalStrut()
//map
marshalMap()
//slice
marshalSlice()
fmt.Println("\n", "---------------JSON反序列化----------", "\n")
//JSON反序列化
//map
unmarshalMap()
//struct
unmarshalStruct()
//slice
unmarshalSlice()
fmt.Println("\n", "---------------寫(xiě)JSON文件----------", "\n")
//結(jié)構(gòu)體
writeStructFile()
//map
writeMapFile()
//slice
writeSliceFile()
fmt.Println("\n", "---------------讀JSON文件----------", "\n")
//struct
readStructFile()
//map
readMapFile()
//slice
readSliceFile()
}
/************************序列化*********************/
func marshalStrut() {
person := Person{Name: "張三", Age: 18, Sex: '男', Hobby: []string{"聽(tīng)音樂(lè)", "看書(shū)", "打籃球"}, Money: 18.62}
if bytes, err := json.Marshal(person); err != nil {
fmt.Println("結(jié)構(gòu)體序列化錯(cuò)誤", err)
} else {
//{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽(tīng)音樂(lè)","看書(shū)","打籃球"],"Money":18.62}
fmt.Println("結(jié)構(gòu)體序列化成功:", string(bytes))
}
}
func marshalMap() {
p := make(map[string]interface{}, 0)
p["0"] = map[string]interface{}{"name": "張三", "age": 18, "sex": '男', "hobby": []string{"聽(tīng)音樂(lè)", "看書(shū)", "打籃球"}, "money": 18.62}
p["1"] = map[string]interface{}{"name": "李四", "age": 19, "sex": '女', "hobby": []string{"聽(tīng)音樂(lè)", "看電影", "打足球"}, "money": 1.62}
if bytes, err := json.Marshal(p); err != nil {
fmt.Println("map 序列化錯(cuò)誤", err)
} else {
// {"0":{"age":18,"hobby":["聽(tīng)音樂(lè)","看書(shū)","打籃球"],"money":18.62,"name":"張三","sex":30007},"1":{"age":19,"hobby":["聽(tīng)音樂(lè)","看電影","打足球"],"money":1.62,"name":"李四","sex":22899}}
fmt.Println("map 序列化成功", string(bytes))
}
}
func marshalSlice() {
p := make([]map[string]interface{}, 0)
p1 := map[string]interface{}{"name": "張三", "age": 18, "sex": '男', "hobby": []string{"聽(tīng)音樂(lè)", "看書(shū)", "打籃球"}, "money": 18.62}
p2 := map[string]interface{}{"name": "李四", "age": 19, "sex": '女', "hobby": []string{"聽(tīng)音樂(lè)", "看電影", "打足球"}, "money": 1.62}
p = append(p, p1, p2)
if bytes, err := json.Marshal(p); err != nil {
fmt.Println("slice 序列化錯(cuò)誤", err)
} else {
// [{"age":18,"hobby":["聽(tīng)音樂(lè)","看書(shū)","打籃球"],"money":18.62,"name":"張三","sex":30007},{"age":19,"hobby":["聽(tīng)音樂(lè)","看電影","打足球"],"money":1.62,"name":"李四","sex":22899}]
fmt.Println("slice 序列化成功", string(bytes))
}
}
/************************反序列化*********************/
func unmarshalMap() {
str := `{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽(tīng)音樂(lè)","看書(shū)","打籃球"],"Money":18.62}`
p := make(map[string]interface{}, 0)
if err := json.Unmarshal([]byte(str), &p); err != nil {
fmt.Println("map 反序列化失敗", err)
} else {
//map[Age:18 Hobby:[聽(tīng)音樂(lè) 看書(shū) 打籃球] Money:18.62 Name:張三 Sex:30007]
fmt.Println("map 反序列化成功", p)
}
}
func unmarshalStruct() {
str := `{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽(tīng)音樂(lè)","看書(shū)","打籃球"],"Money":18.62}`
var p Person
if err := json.Unmarshal([]byte(str), &p); err != nil {
fmt.Println("struct 反序列化失敗", err)
} else {
//{張三 18 30007 [聽(tīng)音樂(lè) 看書(shū) 打籃球] 18.62}
fmt.Println("struct 反序列化成功", p)
}
}
func unmarshalSlice() {
str := `[{"Hobby":["聽(tīng)音樂(lè)","看書(shū)","打籃球"]},{"Hobby":["聽(tīng)書(shū)","看書(shū)","打足球"]}]`
p := make([]map[string]interface{}, 0)
if err := json.Unmarshal([]byte(str), &p); err != nil {
fmt.Println("slice 反序列化失敗", err)
} else {
// [map[Hobby:[聽(tīng)音樂(lè) 看書(shū) 打籃球]]]
fmt.Println("slice 反序列化成功", p)
}
}
/************************寫(xiě)JSON文件*********************/
func writeStructFile() {
p := Person{Name: "張三", Age: 18, Sex: '男', Hobby: []string{"聽(tīng)英語(yǔ)", "讀書(shū)"}, Money: 15.35}
if distFile, err := os.OpenFile("struct.json", os.O_CREATE|os.O_TRUNC, 0666); err != nil {
fmt.Println("創(chuàng)建struct文件失敗", err)
} else {
enc := json.NewEncoder(distFile)
if err := enc.Encode(&p); err != nil {
fmt.Println("寫(xiě)入struct文件失敗", err)
} else {
fmt.Println("寫(xiě)入struct文件成功")
}
}
}
func writeMapFile() {
p := make(map[string]interface{}, 0)
p["name"] = "張三"
p["age"] = 18
p["sex"] = '男'
p["hobby"] = []string{"聽(tīng)英語(yǔ)", "看書(shū)"}
p["money"] = 15.63
if distFile, err := os.OpenFile("map.json", os.O_CREATE, 0666); err != nil {
fmt.Println("創(chuàng)建map 文件失敗", err)
} else {
enc := json.NewEncoder(distFile)
if err := enc.Encode(p); err != nil {
fmt.Println("寫(xiě)入map文件失敗", err)
} else {
fmt.Println("寫(xiě)入map 文件成功")
}
}
}
func writeSliceFile() {
p := make([]map[string]interface{}, 0)
p1 := map[string]interface{}{"name": "張三", "age": 18, "sex": '男', "hobby": []string{"聽(tīng)書(shū)", "看電視"}, "money": 15.84}
p2 := map[string]interface{}{"name": "李四", "age": 20, "sex": '女', "hobby": []string{"打籃球", "看書(shū)"}, "money": 125.84}
p = append(p, p1, p2)
if distFile, err := os.OpenFile("slice.json", os.O_CREATE, 0666); err != nil {
fmt.Println("創(chuàng)建slice文件失敗", err)
} else {
enc := json.NewEncoder(distFile)
if err := enc.Encode(p); err != nil {
fmt.Println("寫(xiě)入slice 文件失敗", err)
} else {
fmt.Println("寫(xiě)入slice 文件成功")
}
}
}
/************************讀JSON文件*********************/
func readStructFile() {
var p = new(Person)
if err := readFile("struct.json", "打開(kāi)struct 文件失敗", &p); err != nil {
fmt.Println("讀入struct 文件失敗", err)
} else {
fmt.Println("讀取struct 文件成功", *p)
}
}
func readMapFile() {
p := make(map[string]interface{}, 0)
if err := readFile("map.json", "打開(kāi)map 文件失敗", &p); err != nil {
fmt.Println("讀取map 文件失敗", err)
} else {
fmt.Println("讀取map 文件成功", p)
}
}
func readSliceFile() {
p := make([]map[string]interface{}, 0)
if err := readFile("slice.json", "打開(kāi)slice 文件失敗", &p); err != nil {
fmt.Println("讀入slice 文件失敗", err)
} else {
fmt.Println("讀取slice 文件成功", p)
}
}
//封裝
func readFile(f string, c string, v interface{}) error {
if srcFile := openFile(f, c); srcFile != nil {
en := json.NewDecoder(srcFile)
if err := en.Decode(v); err != nil {
return err
}
}
return nil
}
func openFile(f string, c string) *os.File {
if srcFile, err := os.Open(f); err != nil {
fmt.Println(c, err)
} else {
return srcFile
}
return nil
}
以上就是Go語(yǔ)言基礎(chǔ)Json序列化反序列化及文件讀寫(xiě)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言Json序列化反序列化及文件讀寫(xiě)的資料請(qǐng)關(guān)注本站其它相關(guān)文章!
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信