【Golang 基础系列十八】Go语言JSON - Go语言中文社区

【Golang 基础系列十八】Go语言JSON


在这里插入图片描述

概述

JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的、键值对的数据交换格式。结构由大括号’{}’,中括号’[]’,逗号’,’,冒号’;’,双引号’""'组成,包含的数据类型有Object,Number,Boolean,String,Array, NULL等。

目录

  1. JSON序列化
  2. JSON反序列化
  3. 写JSON文件
  4. 读JSON文件
  5. 示例

JSON序列化

将Go语言原数据转换成JSON格式字符串

语法:

//传map,结构体,slice...,返回结果byte切片和error是否错误
func Marshal(v interface{}) ([]byte, error)
  1. 结构体转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))
    }
    
  2. 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))
    }
    
  3. 切片转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
  1. 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)
    }
    
  2. 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)
    }
    
  3. 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
  1. 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("写入文件成功")
      }
    }
    
  2. 切片写入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 文件成功")
      }
    }
    
  3. 结构体写入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
  1. 解码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)
      }
    }
    
  2. 解码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)
      }
    }
    
    
  3. 解码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{"听音乐", "看书", "打篮
                        
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/guofeng93/article/details/93212627
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢