Go JSON的使用

引言

JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是。JSON由于比XML更小、更快,更易解析,以及浏览器的内建快速解析支持,使得其更适用于网络数据传输领域。目前我们看到很多的开放平台,基本上都是采用了JSON作为他们的数据交互的接口。既然JSON在Web开发中如此重要,那么Go语言对JSON支持的怎么样呢?Go语言的标准库已经非常好的支持了JSON,可以很容易的对JSON数据进行编、解码的工作。

简单的说 json很适合用于网络数据传输,go语言对json的支持很好

生成JSON

func Marshal(v interface{}) ([]byte, error)

​ 将任意类型的数据转成byte[] 类型

  1. 结构体转JSON

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    type Person struct {
    	//自定义字段名
    	Name string `json:"name"`
    	//Age不会导出到JSON
    	Age int `json:"-"`
    	//如果Rmb为空 则不会输出到JSON
    	Rmb   float64 `json:"rmb,omitempty"`
    	//开头字母小写 不会输出到JSON
    	sex   bool
    	Hobby []string
    }
    
    func main() {
    	person := Person{"于谦", 50, 123.22, true, []string{"eat", "drink"}}
    	marshal, err := json.Marshal(person)
    	if err != nil {
    		fmt.Println("序列化失败,err=", err)
    		return
    	}
    	fmt.Println(string(marshal))
    }
    // 打印结果
    //{"name":"于谦","rmb":123.22,"Hobby":["eat","drink"]}
    
    
    
  2. map转JSON

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    func main() {
    	dataMap := make(map[string]interface{})
    	dataMap["name"] = "于谦"
    	dataMap["age"] = 50
    	dataMap["rmb"] = 2314.14
    	dataMap["sex"] = true
    	dataMap["hobby"] = []string{"eat", "drink"}
    
    	bytes, err := json.Marshal(dataMap)
    	if err != nil {
    		fmt.Println("序列化失败,err=", err)
    		return
    	}
    	fmt.Println(string(bytes))
    
    }
    //打印结果
    //{"age":50,"hobby":["eat","drink"],"name":"于谦","rmb":2314.14,"sex":true}
    

解析JSON

func Unmarshal(data []byte, v interface{}) error
  1. JSON转结构体

    网站生成接收的结构体 https://oktools.net/json2go

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    // Person 同理 字段名开头字母大写才能接受
    //JSON解析的时候只会解析能找得到的字段,找不到的字段会被忽略,
    //当你接收到一个很大的JSON数据结构而你却只想获取其中的部分数据的时候,你只需将你想要的数据对应的字段名大写,即可轻松解决这个问题
    type Person struct {
    	Name  string
    	Age   int
    	Rmb   float64
    	Sex   bool
    	Hobby []string
    }
    
    func main() {
    	jsonStr := `{"Name":"于谦","Age":50,"Rmb":123.22,"Sex":true,"Hobby":["eat","drink"]}`
    	JsonBytes := []byte(jsonStr)
    
    	p := new(Person)
    	err := json.Unmarshal(JsonBytes, &p)
    	if err != nil {
    		fmt.Println(err)
    		return
    	}
    	fmt.Println(*p)
    }
    
    
  2. JSON转map

    package main
    
    import (
    	"encoding/json"
    	"fmt"
    )
    
    func main() {
    	jsonStr := `{"Name":"于谦","Age":50,"Rmb":123.22,"Sex":true,"Hobby":["eat","drink"]}`
    	JsonBytes := []byte(jsonStr)
    	dataMap := make(map[string]interface{})
    	err := json.Unmarshal(JsonBytes, &dataMap)
    	if err != nil {
    		fmt.Println("err=", err)
    		return
    	}
    	fmt.Println(dataMap)
    }
    
    

map对于JSON的接收和生成方式都比较单一,但是万能

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海边的宇航员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值