发布于 

go基础操作1

go基础操作| Json | 笔记整理!

转换

基础转换 | Marshal + MarshalIndent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package main

import (
"encoding/json"
"fmt"
)

func main() {
d := map[string][]string{
"name": {"亚索"},
"skill": {"浪客之道", "斩钢闪", "风之障壁", "踏前斩", "狂风绝息斩"},
}
// 到Marshal()函数返回的JSON字符串是没有空白字符和缩进的
// 不是很适合阅读的
if data, err := json.Marshal(d); err == nil {
fmt.Printf("%s\n",data)
}

// MarshalIndent is like Marshal but applies Indent to format the output.
// Each JSON element in the output will begin on a new line beginning with prefix
// followed by one or more copies of indent according to the indentation nesting.
// 传入的三个参数是 这样的: v any, prefix, indent string
if data, err := json.MarshalIndent(d,""," "); err == nil {
fmt.Printf("%s\n",data)
}
}

结构体转换 | 注意私有和公有

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
"encoding/json"
"fmt"
)

type Hero struct {
Name string `json:"_name"`
Age int `json:"_age"`
Mainskill string `json:"_mainSkill"`
// 不大写的话 json转换出结果时候 不对外暴露
// struct field addr has json tag but is not exported
addr string `json:"_addr"`
}

func main() {
Yasuo := Hero{"亚索", 20, "狂风绝息斩", "艾欧尼亚"}
fmt.Println(Yasuo)
info, err:= json.Marshal(Yasuo)
if err!=nil{
fmt.Println("出现错误!")
}
fmt.Println(string(info))
}

处理匿名字段 | 继承问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
"encoding/json"
"fmt"
)
type User struct{
IkunLevel
Name string
}
type IkunLevel struct{
Sing int
Rap int
Dance int
}
func main() {
// json包在解析匿名字段时,会将匿名字段的字段当成该结构体的字段处理
xiaoHeiZi:=User{
IkunLevel{1,2,3},"小黑子",
}
fmt.Println(xiaoHeiZi)
if data,err:=json.Marshal(xiaoHeiZi);err==nil{
fmt.Printf("%s \n",data)
}
}

补充

  • Marshal()函数只有在转换成功的时候才会返回数据,在转换的过程中需要注意。
  • JSON对象只支持string作为key,所以要编码一个map,必须是map[string]T这种类型(T是Go语言中的任意类型)。
  • channelcomplexfunction是不能被编码成JSON的。
  • 指针在编码的时候会输出指针指向的内容,而空指针会输出null

解析

直接解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"encoding/json"
"fmt"
)
func main() {
// 1. 直接解析
data := `[{"Sing":"1","Rap":"2","Dance":"3","Name":"小黑子"}]`
var dbgInfos []map[string]string
// 字符串解析为 map切片
json.Unmarshal([]byte(data), &dbgInfos)
fmt.Println(dbgInfos)
}

结构体解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main

import (
"encoding/json"
"fmt"
)

type IkunLevel struct {
Sing int
Rap int
Dance int
}

func main() {

// 2. 结构体解析
info := `[{"Sing":1,"Rap":2,"Dance":3},` + `{"Sing":2,"Rap":2,"Dance":3}]`
var ikun []IkunLevel // 解析多个的时候开数组就行
json.Unmarshal([]byte(info), &ikun)
fmt.Println(ikun)
}

结构体嵌套 | 匿名字段解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main

import (
"encoding/json"
"fmt"
)

type User struct {
IkunLevel
Name string
}
type IkunLevel struct {
Sing int
Rap int
Dance int
}

func main() {
// 3. 结构体解析 + 嵌套!
info := `{"Sing":1,"Rap":2,"Dance":3,"Name":"小黑子"}`
var xiaoHeiZi User
json.Unmarshal([]byte(info), &xiaoHeiZi)
fmt.Println(xiaoHeiZi)
}

附录 | 参考 | 好文

  1. 千锋教育go开发图书(微信读书)
  2. go语言官方json库