目录
本文讲述golang如何把结构数据转化成json,json文件数据转化成struct数据的,并给出例子。
JSON(JavaScript Object Notation)是一种基于JavaScript语法子集的开放标准数据交换格式。JSON是基于文本的,轻量级的,通常被认为易于读/写。
Json是一种比XML更轻量级的数据交换格式,更适合成为较为理想,跨平台,跨语言的数据交换语言,成为项目配置文件的首选。开发者可以用Json传输简单的字符串,数字,布尔值,也可以传输一个数组,或者更复杂的复合结构。广泛应用在web服务端与客户端之间通信或者RPC通信中。
Golang内建对json的支持,使用encoding/json标准库,就可以使用go程序生成和解析Json格式的数据。
那具体怎么使用golang对json的转化呢?
Golang库中对json编解码的函数是json.Marshal()和json.Unmarshal()。
JSON编码
编码时,json.Marshal()函数声明如下:
func Marshal(v interface{}) ([]byte, error)
用Marshal函数的步骤如下:
1. 准备一个类型的结构体,如Book
type Book struct {
Title string
Authors []string
IsPublished bool
}
2. 针对Book类型有一个实例对象
go book := Book {
"Go语言编程"
{"ABC", "CDA"}
true
}
3. 使用json.Marshal()将gobook实例生成一段json格式的文本
b, err := json.Marshal(gobook)
/*
b变量结果为
b == []byte(`{
"Title": "Go语言编程",
"Authors": ["ABC","DBA"],
"IsPublished": true
}`)
*/
当我们调用json.Marshal(gobook)时,会递归遍历gobook对象,如果发现gobook数据结构实现编码接口并包含有效值,Marshal()就会调用MarshalJSON()方法生成JSON格式的文本。
JSON解码
解码时,使用Unmarshal()将json文本解码为go预期的数据结构,json.Unmarshal()原型如下:
func Unmarshal(data []byte, v interface{}) error
使用Unmarshal()的步骤如下:
1. 在go中创建一个目标类型的实例对象,用于存放解码后的值
var book Book
调用unmarshal函数,将byte[]类型的json数据作为第一个参数传入,将book实例变量作为第二个参数传入
err := json.Unmarshal(b, &book)
如果json数据和book一一对应,就可以把json值放入book变量中。
如何解码?
json.Unmarshal()会根据约定的顺序查找标签字段,当json数据里边的结构和目标类型结构对不上,在解码过程中会丢弃该字段。
另外,在go的标准库中,允许使用map[string]interface{}和[]interface{}类型来存放未知结构的json对象或数组
对于json的流式读写,用Decoder和Encoder类型来操作
func NewDecoder(r io.Reader) *Decoder
func NewEncoder(w io.writer) *Encoder
这里补充json标签的概念,tag就是标签,给结构体的每个字段打上一个标签,标签冒号前是类型,后面是标签名
package main
import (
"encoding/json"
"fmt"
)
// IP
type IPBlackList struct {
IP []string `json:"IP"`
}
func main() {
p := &IPBlackList{}
p.IP = []string{"172.16.1.236", "172.16.1.235", "127.0.0.1"}
data, _ := json.Marshal(p)
fmt.Println(string(data))
}
输出:
{"IP":["172.16.1.236","172.16.1.235","127.0.0.1"]}
关于json文件转golang struct 发现网上很多例子都是错的 根本读不出来,以我为准:
// convert json to struct
package main
import (
"fmt"
"encoding/json"
)
type Host struct {
BlackListIP []string
WhiteListIP []string
}
func main() {
b := []byte(`{
"blackListIP":["172.16.1.236","172.16.1.235","127.0.0.1"],
"whiteListIP":["172.16.1.230"]
}`)
m := Host{}
err := json.Unmarshal(b, &m)
if err != nil {
fmt.Println("Umarshal failed:", err)
return
}
fmt.Println("m:", m)
if len(m.WhiteListIP) == 0 {
for _, ip := range m.BlackListIP {
fmt.Println("m.BlackListIP: ", ip)
}
} else {
for _, ip := range m.WhiteListIP {
fmt.Println("m.WhiteListIP: ", ip)
}
}
}
这段代码逻辑是在配置json文件中,如果存在白名单ip,则执行白名单ip;否则如果存在黑名单ip,则执行黑名单ip逻辑(开启ip限制开关在其他地方配置)
输出:
m: {[172.16.1.236 172.16.1.235 127.0.0.1] [172.16.1.230]}
m.WhiteListIP: 172.16.1.230
参考:go语言基础