欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年11月16日 17:13:12   作者:楓少文  
這篇文章主要為大家介紹了Go語言基礎(chǔ)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語言基礎(chǔ)Json序列化反序列化及文件讀寫示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語言Json序列化反序列化及文件讀寫的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:

相關(guān)文章

  • 一文詳解Golang的函數(shù)特性

    一文詳解Golang的函數(shù)特性

    函數(shù)是?Golang?中非常重要的組成部分之一,它們提供了代碼的可重用性和組織性。在本文中,我們將深入了解?Golang?函數(shù)的多個方面,希望對大家有所幫助
    2023-04-04
  • golang實(shí)現(xiàn)http server提供文件下載功能

    golang實(shí)現(xiàn)http server提供文件下載功能

    這篇文章主要介紹了golang實(shí)現(xiàn)http server提供文件下載功能,本文給大家簡單介紹了Golang的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • golang定時任務(wù)cron項(xiàng)目實(shí)操指南

    golang定時任務(wù)cron項(xiàng)目實(shí)操指南

    Go實(shí)現(xiàn)的cron 表達(dá)式的基本語法跟linux 中的 crontab基本是類似的,下面這篇文章主要給大家介紹了關(guān)于golang定時任務(wù)cron項(xiàng)目實(shí)操的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • golang中字符串MD5生成方式總結(jié)

    golang中字符串MD5生成方式總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于golang中字符串MD5生成方式總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • Golang搭建HTTP服務(wù)器

    Golang搭建HTTP服務(wù)器

    Golang是一種非常流行的編程語言,它的開發(fā)速度快,代碼運(yùn)行效率高等特點(diǎn)非常適合做Web應(yīng)用的開發(fā)。本文將介紹如何使用Golang搭建HTTP服務(wù)器,需要的朋友可以參考閱讀
    2023-04-04
  • Golang控制協(xié)程執(zhí)行順序方法詳解

    Golang控制協(xié)程執(zhí)行順序方法詳解

    這篇文章主要介紹了Golang控制協(xié)程執(zhí)行順序的方法,Golang的語法和運(yùn)行時直接內(nèi)置了對并發(fā)的支持。Golang里的并發(fā)指的是能讓某個函數(shù)獨(dú)立于其他函數(shù)運(yùn)行的能力
    2022-11-11
  • Golang多線程排序?qū)崿F(xiàn)快速高效地處理大規(guī)模數(shù)據(jù)

    Golang多線程排序?qū)崿F(xiàn)快速高效地處理大規(guī)模數(shù)據(jù)

    Golang多線程排序是一種快速高效地處理大規(guī)模數(shù)據(jù)的方法,通過使用Golang的協(xié)程和通道,可以將排序任務(wù)分配到多個線程中并行處理,提高了排序的效率和速度,需要詳細(xì)了解可以參考下文
    2023-05-05
  • Golang使用Channel組建高并發(fā)HTTP服務(wù)器

    Golang使用Channel組建高并發(fā)HTTP服務(wù)器

    Golang 作為一門高效的語言,在網(wǎng)絡(luò)編程方面表現(xiàn)也非常出色,這篇文章主要介紹了如何使用 Golang 和 Channel 組建高并發(fā) HTTP 服務(wù)器,感興趣的可以了解一下
    2023-06-06
  • 淺談Go語言并發(fā)機(jī)制

    淺談Go語言并發(fā)機(jī)制

    這篇文章主要介紹了淺談Go語言并發(fā)機(jī)制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • 服務(wù)器端Go程序?qū)﹂L短鏈接的處理及運(yùn)行參數(shù)的保存

    服務(wù)器端Go程序?qū)﹂L短鏈接的處理及運(yùn)行參數(shù)的保存

    這篇文章主要介紹了服務(wù)器端Go程序?qū)﹂L短鏈接的處理及運(yùn)行參數(shù)的保存,這里針對使用Go語言編寫的Socket服務(wù)器進(jìn)行實(shí)例說明,需要的朋友可以參考下
    2016-03-03

最新評論