数据格式介绍

  • 是系统中数据交互不可缺少的内容
  • 这里主要介绍JSON、XML、MSGPack

JSON

  • json是完全独立于语言的文本格式,是k-v的形式 name:zs
  • 应用场景:前后端交互,系统间数据交互

    json使用go语言内置的encoding/json 标准库

    编码json使用json.Marshal()函数可以对一组数据进行JSON格式的编码

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

    示例过结构体生成json
点击查看代码
  1. type Person struct {
  2. Name string `json:"name"`
  3. Hobby []string `json:"hobby"`
  4. }
  5. func main() {
  6. p := Person{Name: "lisi", Hobby: []string{"pingpang", "LOL"}}
  7. b, err := json.Marshal(&p)
  8. if err != nil {
  9. fmt.Println("Marshal err", err)
  10. }
  11. fmt.Println(string(b))
  12. // 格式化输出
  13. b2, err := json.MarshalIndent(p, "", "\t")
  14. if err != nil {
  15. fmt.Println("Marshal err", err)
  16. }
  17. fmt.Println(string(b2))
  18. }

struct tag

  1. type Person struct {
  2. // "-" 是忽略的意思
  3. Name string `json:"-"`
  4. Hobby []string `json:"hobby"`
  5. }

示例:通过map生成json

  1. func main() {
  2. m1 := make(map[string]interface{})
  3. m1["name"] = "王五"
  4. m1["age"] = 88
  5. b , _ := json.Marshal(&m1)
  6. fmt.Println(string(b))
  7. }
  • 解码json使用json.Unmarshal()函数可以对一组数据进行JSON格式的解码

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

示例解析到结构体:

点击查看代码
  1. type Person struct {
  2. Age int `json:"age,string"`
  3. Name string `json:"name"`
  4. Niubility bool `json:"niubility"`
  5. }
  6. func main() {
  7. b := []byte(`{"age": "18", "name": "王五", "niubibity": true}`)
  8. var p Person
  9. if err := json.Unmarshal(b, &p); err != nil {
  10. fmt.Println(err.Error())
  11. }
  12. fmt.Println(p)
  13. }
  • 示例解析到interface
点击查看代码
  1. func main() {
  2. // int和float64都当float64
  3. b := []byte(`{"age": 3.14, "name": "王五", "niubibity": true}`)
  4. var i interface{}
  5. if err := json.Unmarshal(b, &i); err != nil {
  6. fmt.Println(err.Error())
  7. }
  8. // 自动转到map
  9. fmt.Println(i)
  10. // 可以判断类型
  11. m := i.(map[string]interface{})
  12. for k, v := range m {
  13. switch vv := v.(type) {
  14. case float64:
  15. fmt.Println(k, "是float64类型", vv)
  16. case string:
  17. fmt.Println(k, "是string类型", vv)
  18. case bool:
  19. fmt.Println(k, "是bool类型", vv)
  20. default:
  21. fmt.Println("其它类型")
  22. }
  23. }
  24. }

XML

  • 是可扩展标记语言,包含声明、根标签、子元素和属性
  • 应用场景:配置文件以及webService

    示例:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <servers version="1">
  3. <server>
  4. <serverName>Shanghai_VPN</serverName>
  5. <serverIP>127.0.0.1</serverIP>
  6. </server>
  7. <server>
  8. <serverName>Beijing_VPN</serverName>
  9. <serverIP>127.0.0.2</serverIP>
  10. </server>
  11. </servers>
点击查看代码
  1. // 抽取单个server对象
  2. type Server struct {
  3. ServerName string `xml:"serverName"`
  4. ServerIP string `xml:"serverIP"`
  5. }
  6. type Servers struct {
  7. Name xml.Name `xml:"servers"`
  8. Version string `xml:"version"`
  9. Servers []Server `xml:"server"`
  10. }
  11. func main() {
  12. b, err := ioutil.ReadFile("./my.xml")
  13. if err != nil {
  14. fmt.Println(err.Error())
  15. return
  16. }
  17. var s Servers
  18. if err := xml.Unmarshal(b, &s); err != nil {
  19. fmt.Println(err.Error())
  20. return
  21. }
  22. fmt.Printf("%#v", s)
  23. }

MSGPack

  • MSGPack是二进制的json,性能更快,更省空间
  • 需要安装第三方包:go get -u github.com/vmihailenco/msgpack
点击查看代码
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/vmihailenco/msgpack/v5"
  6. )
  7. type Person struct {
  8. Name string `json:"name"`
  9. Age int `json:"age"`
  10. }
  11. func main() {
  12. p := Person{Name: "张三", Age: 35}
  13. b, err := msgpack.Marshal(&p)
  14. b2, _ := json.Marshal(&p)
  15. fmt.Println(len(b)) // 18
  16. fmt.Println(len(b2)) // 26
  17. // 很明显,二进制的json更省空间,性能也更高
  18. if err != nil {
  19. fmt.Println(err.Error())
  20. return
  21. }
  22. var p2 Person
  23. if err := msgpack.Unmarshal(b, &p2); err != nil {
  24. fmt.Println(err.Error())
  25. return
  26. }
  27. fmt.Println(p2)
  28. var m1 interface{}
  29. msgpack.Unmarshal(b, &m1)
  30. fmt.Println(m1)
  31. }

msgpackage写入到文件,从文件读取案例:

点击查看代码
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/vmihailenco/msgpack/v5"
  5. "io/ioutil"
  6. "math/rand"
  7. )
  8. type Person struct {
  9. Name string
  10. Age int
  11. Sex string
  12. }
  13. // 结构体转成json并写入到文件
  14. func writerJson(filename string) (err error) {
  15. var persons []*Person
  16. // 假数据
  17. for i := 0; i < 10; i++ {
  18. p := &Person{
  19. Name: fmt.Sprintf("name%d", i),
  20. Age: rand.Intn(100),
  21. Sex: "male",
  22. }
  23. persons = append(persons, p)
  24. }
  25. // 二进制json序列化
  26. data, err := msgpack.Marshal(persons)
  27. if err != nil {
  28. fmt.Println(err)
  29. return
  30. }
  31. err = ioutil.WriteFile(filename, data, 0666)
  32. if err != nil {
  33. fmt.Println(err)
  34. return
  35. }
  36. return
  37. }
  38. // 从json文件中读取json数据并转成结构体
  39. func readJson(filename string) (err error) {
  40. bData, err := ioutil.ReadFile(filename)
  41. if err != nil {
  42. fmt.Println(err)
  43. return
  44. }
  45. var person []*Person // 注意:此处必须传指针
  46. if err = msgpack.Unmarshal(bData, &person); err != nil {
  47. fmt.Println(err)
  48. return
  49. }
  50. for _, v := range person {
  51. fmt.Printf("%#v\n", *v)
  52. }
  53. return nil
  54. }
  55. func main() {
  56. err := writerJson("./data4.json")
  57. if err != nil {
  58. fmt.Println(err)
  59. return
  60. }
  61. if err := readJson("./data4.json"); err != nil {
  62. fmt.Println(err)
  63. }
  64. }

注意:Marshal将结构体序列化成json的时候,传值或指针都可以,推荐传递指针

Unmarshal将json数据转换成结构体的时候,必须传递指针类型,因为需要通过指针进行赋值

参考网址:msgpack

golang中的标准库数据格式的更多相关文章

  1. golang中的标准库context

    在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...

  2. golang中的标准库log

    Go语言内置的log包实现了简单的日志服务.本文介绍了标准库log的基本使用. 使用Logger log包定义了Logger类型,该类型提供了一些格式化输出的方法.本包也提供了一个预定义的" ...

  3. golang中的标准库context解读

    简介 golang 中的创建一个新的 goroutine , 并不会返回像c语言类似的pid,所有我们不能从外部杀死某个goroutine,所有我就得让它自己结束,之前我们用 channel + se ...

  4. golang中的标准库http

    Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. http客户端 基本的HTTP/HTTPS请求 Get.Head.Post和PostForm函数发出HTTP/HTTP ...

  5. golang中的标准库template

    html/template包实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出.它提供了和text/template包相同的接口,Go语言中输出HTML的场景都应使用text/templa ...

  6. golang中的标准库strconv

    strconv 包 strconv包实现了基本数据类型与其字符串表示的转换,主要有以下常用函数: Atoi().Itia().parse系列.format系列.append系列. string与int ...

  7. golang中的标准库IO操作

    参考链接 输入输出的底层原理 终端其实是一个文件,相关实例如下: os.Stdin:标准输入的文件实例,类型为*File os.Stdout:标准输出的文件实例,类型为*File os.Stderr: ...

  8. golang中的标准库time

    时间类型 time.Time类型表示时间.我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息.示例代码如下: func main() { current := ...

  9. golang中的标准库反射

    反射 反射是指程序在运行期对程序本身访问和修改的能力 变量的内在机制 变量包含类型信息和值信息 var arr [10]int arr[0] = 10 类型信息:是静态的元信息,是预先定义好的 值信息 ...

随机推荐

  1. 【九度OJ】题目1434:今年暑假不AC 解题报告

    [九度OJ]题目1434:今年暑假不AC 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1434 题目描述: "今年暑假不A ...

  2. LeetCode解题报告汇总! All in One!

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 把自己刷过的所有题目做一个整理,并且用简洁的语言概括了一下思路,汇总成了一个表格. 题目 ...

  3. 【LeetCode】28. Implement strStr() 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 find函数 遍历+切片 日期 题目地址:https ...

  4. 【LeetCode】449. Serialize and Deserialize BST 解题报告(Python)

    [LeetCode]449. Serialize and Deserialize BST 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/pro ...

  5. 【LeetCode】819. Most Common Word 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 正则+统计 日期 题目地址:https://leet ...

  6. a.equals(b) 判断对象相等

    一.值是null的情况: 1.a.equals(b), a 是null, 抛出NullPointException异常. 2.a.equals(b), a不是null, b是null,  返回fals ...

  7. 使用.NET 6开发TodoList应用(11)——使用FluentValidation和MediatR实现接口请求验证

    系列导航及源代码 使用.NET 6开发TodoList应用文章索引 需求 在响应请求处理的过程中,我们经常需要对请求参数的合法性进行校验,如果参数不合法,将不继续进行业务逻辑的处理.我们当然可以将每个 ...

  8. Going Deeper with Convolutions (GoogLeNet)

    目录 代码 Szegedy C, Liu W, Jia Y, et al. Going deeper with convolutions[C]. computer vision and pattern ...

  9. zbar解析二维码demo

    开发环境;ubuntu 18.04 IDE:clion 2019 源文件.cpp #include <opencv2/opencv.hpp> #include <zbar.h> ...

  10. CS5210完全替代AG6202|HDMI转VGA芯片+原理图|替代兼容AG6202

    安格AG6202是一个HDMI转VGA不带音频解决方案,用于实现HDMI1.4高分辨率视频转VGA转换器.Capstone  CS5210不管在性能上和设计参数上面都是可以完全替代安格AG6202,且 ...