数据格式介绍

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

JSON

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

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

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

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

    示例过结构体生成json
点击查看代码
type Person struct {
Name string `json:"name"`
Hobby []string `json:"hobby"`
} func main() {
p := Person{Name: "lisi", Hobby: []string{"pingpang", "LOL"}}
b, err := json.Marshal(&p)
if err != nil {
fmt.Println("Marshal err", err)
}
fmt.Println(string(b)) // 格式化输出
b2, err := json.MarshalIndent(p, "", "\t")
if err != nil {
fmt.Println("Marshal err", err)
}
fmt.Println(string(b2))
}

struct tag

type Person struct {
// "-" 是忽略的意思
Name string `json:"-"`
Hobby []string `json:"hobby"`
}

示例:通过map生成json

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

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

示例解析到结构体:

点击查看代码
type Person struct {
Age int `json:"age,string"`
Name string `json:"name"`
Niubility bool `json:"niubility"`
} func main() {
b := []byte(`{"age": "18", "name": "王五", "niubibity": true}`)
var p Person
if err := json.Unmarshal(b, &p); err != nil {
fmt.Println(err.Error())
}
fmt.Println(p)
}
  • 示例解析到interface
点击查看代码
func main() {
// int和float64都当float64
b := []byte(`{"age": 3.14, "name": "王五", "niubibity": true}`)
var i interface{}
if err := json.Unmarshal(b, &i); err != nil {
fmt.Println(err.Error())
}
// 自动转到map
fmt.Println(i)
// 可以判断类型
m := i.(map[string]interface{})
for k, v := range m {
switch vv := v.(type) {
case float64:
fmt.Println(k, "是float64类型", vv)
case string:
fmt.Println(k, "是string类型", vv)
case bool:
fmt.Println(k, "是bool类型", vv)
default:
fmt.Println("其它类型")
}
}
}

XML

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

    示例:
<?xml version="1.0" encoding="UTF-8" ?>
<servers version="1">
<server>
<serverName>Shanghai_VPN</serverName>
<serverIP>127.0.0.1</serverIP>
</server>
<server>
<serverName>Beijing_VPN</serverName>
<serverIP>127.0.0.2</serverIP>
</server>
</servers>
点击查看代码
// 抽取单个server对象
type Server struct {
ServerName string `xml:"serverName"`
ServerIP string `xml:"serverIP"`
}
type Servers struct {
Name xml.Name `xml:"servers"`
Version string `xml:"version"`
Servers []Server `xml:"server"`
} func main() {
b, err := ioutil.ReadFile("./my.xml")
if err != nil {
fmt.Println(err.Error())
return
}
var s Servers
if err := xml.Unmarshal(b, &s); err != nil {
fmt.Println(err.Error())
return
}
fmt.Printf("%#v", s)
}

MSGPack

  • MSGPack是二进制的json,性能更快,更省空间
  • 需要安装第三方包:go get -u github.com/vmihailenco/msgpack
点击查看代码
package main

import (
"encoding/json"
"fmt"
"github.com/vmihailenco/msgpack/v5"
) type Person struct {
Name string `json:"name"`
Age int `json:"age"`
} func main() {
p := Person{Name: "张三", Age: 35}
b, err := msgpack.Marshal(&p)
b2, _ := json.Marshal(&p)
fmt.Println(len(b)) // 18
fmt.Println(len(b2)) // 26
// 很明显,二进制的json更省空间,性能也更高
if err != nil {
fmt.Println(err.Error())
return
} var p2 Person
if err := msgpack.Unmarshal(b, &p2); err != nil {
fmt.Println(err.Error())
return
}
fmt.Println(p2) var m1 interface{}
msgpack.Unmarshal(b, &m1)
fmt.Println(m1) }

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

点击查看代码
package main

import (
"fmt"
"github.com/vmihailenco/msgpack/v5"
"io/ioutil"
"math/rand"
) type Person struct {
Name string
Age int
Sex string
} // 结构体转成json并写入到文件
func writerJson(filename string) (err error) {
var persons []*Person
// 假数据
for i := 0; i < 10; i++ {
p := &Person{
Name: fmt.Sprintf("name%d", i),
Age: rand.Intn(100),
Sex: "male",
}
persons = append(persons, p)
}
// 二进制json序列化
data, err := msgpack.Marshal(persons)
if err != nil {
fmt.Println(err)
return
}
err = ioutil.WriteFile(filename, data, 0666)
if err != nil {
fmt.Println(err)
return
}
return
} // 从json文件中读取json数据并转成结构体
func readJson(filename string) (err error) {
bData, err := ioutil.ReadFile(filename)
if err != nil {
fmt.Println(err)
return
}
var person []*Person // 注意:此处必须传指针
if err = msgpack.Unmarshal(bData, &person); err != nil {
fmt.Println(err)
return
}
for _, v := range person {
fmt.Printf("%#v\n", *v)
}
return nil
} func main() {
err := writerJson("./data4.json")
if err != nil {
fmt.Println(err)
return
} if err := readJson("./data4.json"); err != nil {
fmt.Println(err)
}
}

注意: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. SpringBoot简单整合Gateway网关

    引入依赖 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>s ...

  2. JAVA获取指定日期的周一的日期

    /** * 获取当前周的周一的日期 * @param date 传入当前日期 * @return */ public static Date getThisWeekMonday(Date date) ...

  3. 一个windows主题网站-

    地址 地址 说明 选择适合自己的,下载,双击安装,就可使用了

  4. 【LeetCode】400. Nth Digit 解题报告(Python)

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

  5. Codeforces629 C. Famil Door and Brackets

    C. Famil Door and Brackets time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  6. Java GUI 桌面应用开发

    前言 虽然现在已经很少项目会涉及GUI技术,但作为一个合格的Java开发工程师,还是得了解才得 本文记录,idea使用JFormDesigner插件进行Java GUI 桌面应用开发 GUI Swin ...

  7. contrastive CAM

    目录 概 主要内容 一个有趣的应用 > Prabhushankar M., Kwon G., Temel D. and AlRegib G. Contrastive explanation in ...

  8. javaScript系列 [43]-TS、Class and ES5

    本文讨论Typescript中的Class同ES5构造函数的对应关系,涉及TypeScript的诸多语法.构造函数.面向对象以及原型对象等相关知识点细节,本文只简单对比并不进行深入展开. TypeSc ...

  9. contos mongodb 安装

    创建.repo文件,生成mongodb的源 vi /etc/yum.repos.d/mongodb-org-4.0.repo [mongodb-org-4.0] name=MongoDB Reposi ...

  10. jboss CVE-2015-7501 反序列化漏洞复现

    JBOSS反序列化漏洞 环境: vulfocus jboss CVE-2015-7501 云服务器 kali攻击机 基本原理:JBoss在/invoker/JMXInvokerServlet请求中读取 ...