溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go語言中Json序列化反序列化及文件讀寫的示例分析

發(fā)布時間:2021-11-17 09:09:32 來源:億速云 閱讀:160 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹Go語言中Json序列化反序列化及文件讀寫的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

    Go語言中Json序列化反序列化及文件讀寫的示例分析

    概述

    JSON(JavaScript Object Notation,JavaScript對象表示法)是一種輕量級的、鍵值對的數(shù)據(jù)交換格式。結(jié)構(gòu)由大括號'{}',中括號'[]',逗號',',冒號';',雙引號'""'組成,包含的數(shù)據(jù)類型有Object,Number,Boolean,String,Array, NULL等。

    JSON序列化

    將Go語言原數(shù)據(jù)轉(zhuǎn)換成JSON格式字符串

    語法:

    //傳map,結(jié)構(gòu)體,slice...,返回結(jié)果byte切片和error是否錯誤
    func Marshal(v interface{}) ([]byte, error)

    結(jié)構(gòu)體轉(zhuǎn)JSON

    type Person struct{
       Name string   //姓名
       Age int       //年齡
       Sex rune      //性別
       Hobby []string  //愛好
       Money float64   //錢
    }  
    person:=Person{Name:"張三",Age:18,Sex:'男',Hobby:[]string{"聽音樂","看書","打籃球"},Money:18.62}
    if bytes,err:=json.Marshal(person);err!=nil{
      fmt.Println("編碼錯誤",err)
    }else{
    //{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽音樂","看書","打籃球"],"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{"聽音樂","看書","打籃球"},"money":18.62}
    p["1"]=map[string]interface{}{"name":"李四","age":19,"sex":'女',"hobby":[]string{"聽音樂","看電影","打足球"},"money":1.62}
    
    if bytes,err:=json.Marshal(p);err!=nil{
       fmt.Println("編碼錯誤",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{"聽音樂","看書","打籃球"},"money":18.62}
      p2:=map[string]interface{}{"name":"李四","age":19,"sex":'女',"hobby":[]string{"聽音樂","看電影","打足球"},"money":1.62}
      p=append(p,p1,p2)
    
      if bytes,err:=json.Marshal(p);err!=nil{
        fmt.Println("編碼錯誤",err)
      }else{
        fmt.Println(string(bytes))
      }

    JSON反序列化

    將JSON格式字符串轉(zhuǎn)換成Go語言原數(shù)據(jù)

    //傳入JSON字符串的byte字節(jié)和Go接收數(shù)據(jù)的類型指針,返回err錯誤,是否返回成功
    func Unmarshal(data []byte, v interface{}) error

    JSON轉(zhuǎn)map

    str:=`{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽音樂","看書","打籃球"],"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":["聽音樂","看書","打籃球"],"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":["聽音樂","看書","打籃球"]}]`
    p:=make([]map[string]interface{}, 0)
    
    if err:=json.Unmarshal([]byte(str),&p);err!=nil{
      fmt.Println("解碼失敗",err)
    }else{
      fmt.Println("解析成功",p)
    }

    寫JSON文件

    將Go語言源數(shù)據(jù)寫入到j(luò)son文件

    //第一步  傳文件的路徑,返回文件的可讀可寫,error:是否成功
    //flag:文件標(biāo)識:是創(chuàng)建還是,追加......
    //parm:文件模式表示文件的模式和權(quán)限位,通常,請求的模式為 0666,它使該文件可由任何人讀和寫
    func OpenFile(name string, flag int, perm FileMode) (*File, error)
    或者
    func Create(name string) (*File, error)  //傳入文件的名字,返回文件的對象和error是否成功
    //第二步 傳文件對象,返回一個從w讀取的新編碼器
    func NewEncoder(w io.Writer) *Encoder
    //第三步 編碼器將v寫入流中,后換行
    func (enc *Encoder) Encode(v interface{}) error

    map寫入JSON文件

    p:=make(map[string]interface{}, 0)
    p["name"]="張三"
    p["age"]=18
    p["sex"]='男'
    p["hobby"]=[]string{"聽英語","看書"}
    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("寫入文件失敗", err)
      }else{
        fmt.Println("寫入文件成功")
      }
    }

    切片寫入JSON文件

    p:=make([]map[string]interface{}, 0)
    p1:=map[string]interface{}{"name":"張三","age":18,"sex":'男',"hobby":[]string{"聽書","看電視"},"money":15.84}
    p2:=map[string]interface{}{"name":"李四","age":20,"sex":'女',"hobby":[]string{"打籃球","看書"},"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("寫入slice 文件失敗", err)
      }else{
        fmt.Println("寫入slice 文件成功")
      }
    }

    結(jié)構(gòu)體寫入JSON文件

    p:=Person{Name:"張三",Age:18,Sex:'男',Hobby:[]string{"聽英語","讀書"},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("寫入文件失敗",err)
      }else {
        fmt.Println("寫入文件成功")
      }
    }

    讀JSON文件

    將json文件轉(zhuǎn)換成Go語言源數(shù)據(jù)

    //第一步  傳文件的路徑,返回文件的可讀可寫,error:是否成功
    func Open(name string) (*File, error)
    //第二步 傳文件對象,返回一個從r讀取的新解碼器
    func NewDecoder(r io.Reader) *Decoder
    //第三步 解碼器將值存儲在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("打開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("打開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("打開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   //姓名
    	Age   int      //年齡
    	Sex   rune     //性別
    	Hobby []string //愛好
    	Money float64  //錢
    }
    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", "---------------寫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{"聽音樂", "看書", "打籃球"}, Money: 18.62}
    	if bytes, err := json.Marshal(person); err != nil {
    		fmt.Println("結(jié)構(gòu)體序列化錯誤", err)
    	} else {
    		//{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽音樂","看書","打籃球"],"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{"聽音樂", "看書", "打籃球"}, "money": 18.62}
    	p["1"] = map[string]interface{}{"name": "李四", "age": 19, "sex": '女', "hobby": []string{"聽音樂", "看電影", "打足球"}, "money": 1.62}
    
    	if bytes, err := json.Marshal(p); err != nil {
    		fmt.Println("map 序列化錯誤", err)
    	} else {
    		// {"0":{"age":18,"hobby":["聽音樂","看書","打籃球"],"money":18.62,"name":"張三","sex":30007},"1":{"age":19,"hobby":["聽音樂","看電影","打足球"],"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{"聽音樂", "看書", "打籃球"}, "money": 18.62}
    	p2 := map[string]interface{}{"name": "李四", "age": 19, "sex": '女', "hobby": []string{"聽音樂", "看電影", "打足球"}, "money": 1.62}
    	p = append(p, p1, p2)
    	if bytes, err := json.Marshal(p); err != nil {
    		fmt.Println("slice 序列化錯誤", err)
    	} else {
    		// [{"age":18,"hobby":["聽音樂","看書","打籃球"],"money":18.62,"name":"張三","sex":30007},{"age":19,"hobby":["聽音樂","看電影","打足球"],"money":1.62,"name":"李四","sex":22899}]
    		fmt.Println("slice 序列化成功", string(bytes))
    	}
    }
    /************************反序列化*********************/
    func unmarshalMap() {
    	str := `{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽音樂","看書","打籃球"],"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:[聽音樂 看書 打籃球] Money:18.62 Name:張三 Sex:30007]
    		fmt.Println("map 反序列化成功", p)
    	}
    }
    func unmarshalStruct() {
    	str := `{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽音樂","看書","打籃球"],"Money":18.62}`
    	var p Person
    	if err := json.Unmarshal([]byte(str), &p); err != nil {
    		fmt.Println("struct 反序列化失敗", err)
    	} else {
    		//{張三 18 30007 [聽音樂 看書 打籃球] 18.62}
    		fmt.Println("struct 反序列化成功", p)
    	}
    }
    func unmarshalSlice() {
    	str := `[{"Hobby":["聽音樂","看書","打籃球"]},{"Hobby":["聽書","看書","打足球"]}]`
    	p := make([]map[string]interface{}, 0)
    
    	if err := json.Unmarshal([]byte(str), &p); err != nil {
    		fmt.Println("slice 反序列化失敗", err)
    	} else {
    		// [map[Hobby:[聽音樂 看書 打籃球]]]
    		fmt.Println("slice 反序列化成功", p)
    	}
    }
    /************************寫JSON文件*********************/
    func writeStructFile() {
    	p := Person{Name: "張三", Age: 18, Sex: '男', Hobby: []string{"聽英語", "讀書"}, 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("寫入struct文件失敗", err)
    		} else {
    			fmt.Println("寫入struct文件成功")
    		}
    	}
    }
    func writeMapFile() {
    	p := make(map[string]interface{}, 0)
    	p["name"] = "張三"
    	p["age"] = 18
    	p["sex"] = '男'
    	p["hobby"] = []string{"聽英語", "看書"}
    	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("寫入map文件失敗", err)
    		} else {
    			fmt.Println("寫入map 文件成功")
    		}
    	}
    }
    func writeSliceFile() {
    	p := make([]map[string]interface{}, 0)
    	p1 := map[string]interface{}{"name": "張三", "age": 18, "sex": '男', "hobby": []string{"聽書", "看電視"}, "money": 15.84}
    	p2 := map[string]interface{}{"name": "李四", "age": 20, "sex": '女', "hobby": []string{"打籃球", "看書"}, "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("寫入slice 文件失敗", err)
    		} else {
    			fmt.Println("寫入slice 文件成功")
    		}
    	}
    }
    /************************讀JSON文件*********************/
    func readStructFile() {
    	var p = new(Person)
    
    	if err := readFile("struct.json", "打開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", "打開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", "打開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語言中Json序列化反序列化及文件讀寫的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問一下細節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI