APP下载

GoLang -- json档案操作

消息来源:baojiabao.com 作者: 发布时间:2024-05-09

报价宝综合消息GoLang -- json档案操作

json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支援很好。官方提供的Json解析包已经非常强大,我们接下来讲解Json的序列化与反序列化操作。另外还有一些第三方的Json解析库,也能够高效的操作Json物件,比如simplejson,ffjson等。下面是两个比较重要的函式:

• Json Marshal:将资料编码成json字串

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

Marshal 用于将struct物件序列化到json物件中。v是interface{}型别,任何型别都实现了空界面。

1:tag中的第一个引数是用来指定别名,比如Name 指定别名为 username `json:"username"`

2:如果不想指定别名但是想指定其他引数用逗号来分隔,omitempty 指定到一个field时,如果在赋值时对该属性未赋值或者对该属性赋值为 zero value,那么将Person序列化成json时会忽略该字段

3:- 指定到一个field时,无论有没有值,将Person序列化成json时都会忽略该字段

4:string 指定到一个field时,比如Person中的Count为int型别 如果没有任何指定在序列化到json之后也是int 比如这个样子 “Count”:0,但是如果指定了string之后序列化之后也是string型别的,那么就是这个样子"Count":"0"

• struct序列化为Json

type Person struct {

Name string `json:"username"`

Age int

Gender bool `json:",omitempty"`

Profile string

OmitContent string `json:"-"`

Count int `json:",string"`

}

func main() {

var p *Person = &Person{

Name: "Mr.Tao",

Age: 21,

Gender: true,

Profile: "I am Mr.Tao",

OmitContent: "OmitContent",

}

if bs, err := json.Marshal(p); err != nil {

panic(err)

} else {

fmt.Println(string(bs))

}

}

var p2 *Person = &Person{

Name: "brainwu",

Age: 21,

Profile: "I am Wujunbin",

OmitContent: "OmitConent",

}

if bs, err := json.Marshal(p2); err != nil {

panic(err)

} else {

//result --> {"username":"brainwu","Age":21,"Profile":"I am Wujunbin","Count":"0"}

fmt.Println(string(bs))

}

• slice序列化为Json

//slice序列化为Json

var aStr []string = []string{"Go", "Java", "Python", "Android"}

if bs, err := json.Marshal(aStr); err != nil {

panic(err)

} else {

//result --> ["Go","Java","Python","Android"]

fmt.Println(string(bs))

}

• map 序列化为Json

var m map[string]string = make(map[string]string)

m["Go"] = "No.1"

m["Java"] = "No.2"

m["C"] = "No.3"

if bs, err := json.Marshal(m); err != nil {

panic(err)

} else {

//result --> {"C":"No.3","Go":"No.1","Java":"No.2"}

fmt.Println(string(bs))

}

• Json Unmarshal:将json字串解码到相应的资料结构,Unmarshal的第一个引数是[]byte,第二个引数是接受json解析的资料结构。

下面我们依次讲解Json的操作。

1:将Json序列化进入结构体

type Person struct {

Name string

Age int

Gender bool

}

func main() {

//1:将Json序列化进入结构体

var p Person

var str = "{"Name":"Mr.Tao","Age":20,"Gender":true}"

json.Unmarshal([]byte(str), &p)

fmt.Println(p.Age)

fmt.Println(p.Name)

}

2::将Json序列化到结构体slice

var ps []Person

var aJson = "[{"Name":"zhangsan","Age":25,"Gender":true}, {"Name":"lisi","Age":20,"Gender":false}]"

json.Unmarshal([]byte(aJson), &ps)

fmt.Println(ps, "len is", len(ps))

3:将Json序列化进Map

var str = "{"Name":"zhuyuqiang","Age":20,"Gender":true}"

var obj map[string]interface{}

json.Unmarshal([]byte(str), &obj)

fmt.Println(obj["Name"])

fmt.Println(obj["Gender"])

4:将Json序列化进Slice

var strs string = `["Go", "Java", "C", "Php"]`

var aStr []string

json.Unmarshal([]byte(strs), &aStr)

//result --> [Go Java C Php] len is 4

fmt.Println(aStr, " len is", len(aStr))

2019-09-21 14:56:00

相关文章