Golang中JSON解析结构体

马谦的博客 · · 7810 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一、StructTag介绍

StructTag是go语言结构体中的一个标记字段,放在字段声明的后面,一般只有特定情况下会用到,如json的转化。

使用的时候只要把标记的字段用两个包起来即可,标签内的语法形式通常为key:”value”` ,多个标记用空格隔开。

1
2
3
4
type tagTest struct {
tagA string `TagA`
tagB int `TagB`
}

二、Struct转Json

要想把struct转化成json,只要把结构体内的字段名设置成导出状态,也就是把首字母大写就行了,默认情况下,转化后的json中的key值和结构体中的字段名是一样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main
import (
"fmt"
"encoding/json"
)
type addr struct {
Province string
City string
}
type stu struct {
Name string
Age int
Addr addr
}
func main(){
var xm = stu{Name:"xiaoming", Age:18, Addr:addr{Province:"Hunan",City:"ChangSha"}}
js, err := json.Marshal(xm)
if err != nil{
fmt.Println(err)
return
}
fmt.Println(string(js)) //输出{"Name":"xiaoming","Age":18,"Addr":{"Province":"Hunan","City":"ChangSha"}}
}

三、Json转struct

而在把json转化成struct的时候,要求json和结构体的字段一致才能被成功转化,否则转化后的数据就可能和我们想的不一样。

要注意的是这里可以忽略大小写。

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 (
"fmt"
"encoding/json"
)
type addr struct {
Province string
City string
}
type stu struct {
Name string
Age int
Addr addr
}
func main(){
js := `{"Age":18,"name":"xiaoming","Addr":{"Province":"Hunan","City":"ChangSha"}}` //name是小写
var xm stu
err := json.Unmarshal([]byte(js), &xm)
if err != nil{
fmt.Println(err)
return
}
fmt.Println(xm) //输出{xiaoming 18 {Hunan ChangSha}}
}

四、使用tag

以上都没有tag就能相互转化,说起来好像tag并没有什么用!事实的确也就是这样,tag其实在这里并不是必需的。

但如果我们期望转化后的json字段名和struct里的不一样的话,就得用到tag了。

tag在这里的用途就是提供别名,让两者的转化更加灵活。

tag的使用格式为json:"***" 、‘(***我们期望json转化过后的名字)

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 (
"fmt"
"encoding/json"
)
type addr struct {
Province string `json:"province"` //转化后对应字段的json名为province
City string `json:"city"`
}
type stu struct {
Name string `json:"name"`
Age int `json:"age"`
Addr addr `json:"addr"`
}
func main(){
var xm = stu{Name: "xiaoming", Age: 18, Addr:addr{Province:"Hunan",City:"ChangSha"}}
js, err := json.Marshal(xm)
if err != nil{
fmt.Println(err)
return
}
fmt.Println(string(js))
var xxm stu
err = json.Unmarshal(js, & xxm)
fmt.Println(xxm)
}

输出:

1
2
{"name":"xiaoming","age":18,"addr":{"province":"Hunan","city":"ChangSha"}}//转化的时候会按照我们指定的名字来转
{xiaoming 18 {Hunan ChangSha}}//反过来也是一样

有疑问加站长微信联系(非本文作者)

本文来自:马谦的博客

感谢作者:马谦的博客

查看原文:Golang中JSON解析结构体

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

7810 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传