Go語言基礎Json序列化反序列化及文件讀寫示例詳解
概述
JSON(JavaScript Object Notation,JavaScript對象表示法)是一種輕量級的、鍵值對的數據交換格式。結構由大括號'{}’,中括號'[]’,逗號’,’,冒號’;’,雙引號'””‘組成,包含的數據類型有Object,Number,Boolean,String,Array, NULL等。
JSON序列化
將Go語言原數據轉換成JSON格式字符串
語法:
//傳map,結構體,slice...,返回結果byte切片和error是否錯誤 func Marshal(v interface{}) ([]byte, error)
結構體轉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轉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)) }
切片轉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格式字符串轉換成Go語言原數據
//傳入JSON字符串的byte字節和Go接收數據的類型指針,返回err錯誤,是否返回成功 func Unmarshal(data []byte, v interface{}) error
JSON轉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轉結構體
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轉切片
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語言源數據寫入到json文件
//第一步 傳文件的路徑,返回文件的可讀可寫,error:是否成功 //flag:文件標識:是創建還是,追加...... //parm:文件模式表示文件的模式和權限位,通常,請求的模式為 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("創建文件失敗",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("創建slice文件失敗", err) }else { enc:=json.NewEncoder(distFile) if err:=enc.Encode(p);err!=nil{ fmt.Println("寫入slice 文件失敗", err) }else{ fmt.Println("寫入slice 文件成功") } }
結構體寫入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("創建文件失敗",err) }else{ enc:=json.NewEncoder(distFile) if err:=enc.Encode(&p);err!=nil { fmt.Println("寫入文件失敗",err) }else { fmt.Println("寫入文件成功") } }
讀JSON文件
將json文件轉換成Go語言源數據
//第一步 傳文件的路徑,返回文件的可讀可寫,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文件為結構體
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序列化 //結構體 marshalStrut() //map marshalMap() //slice marshalSlice() fmt.Println("\n", "---------------JSON反序列化----------", "\n") //JSON反序列化 //map unmarshalMap() //struct unmarshalStruct() //slice unmarshalSlice() fmt.Println("\n", "---------------寫JSON文件----------", "\n") //結構體 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("結構體序列化錯誤", err) } else { //{"Name":"張三","Age":18,"Sex":30007,"Hobby":["聽音樂","看書","打籃球"],"Money":18.62} fmt.Println("結構體序列化成功:", 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("創建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("創建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("創建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序列化反序列化及文件讀寫示例詳解的詳細內容,更多關於Go語言Json序列化反序列化及文件讀寫的資料請關註WalkonNet其它相關文章!