go语言之进阶篇json解析到结构体
1、json解析到结构体
示例:
package main
import (
"encoding/json"
"fmt"
)
type IT struct {
Company string `json:"company"`
Subjects []string `json:"subjects"` //二次编码
IsOk bool `json:"isok"`
Price float64 `json:"price"`
}
func main() {
jsonBuf := `
{
"company": "itcast",
"subjects": [
"Go",
"C++",
"Python",
"Test"
],
"isok": true,
"price": 666.666
}`
var tmp IT //定义一个结构体变量
err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二个参数要地址传递
if err != nil {
fmt.Println("err = ", err)
return
}
//fmt.Println("tmp = ", tmp)
fmt.Printf("tmp = %+v\n", tmp)
}
执行结果:
tmp = {Company:itcast Subjects:[Go C++ Python Test] IsOk:true Price:666.666}
示例2: 定义结构体,解析你想生成的字段
package main
import (
"encoding/json"
"fmt"
)
type IT struct {
Company string `json:"company"`
Subjects []string `json:"subjects"` //二次编码
IsOk bool `json:"isok"`
Price float64 `json:"price"`
}
func main() {
jsonBuf := `
{
"company": "itcast",
"subjects": [
"Go",
"C++",
"Python",
"Test"
],
"isok": true,
"price": 666.666
}`
var tmp IT //定义一个结构体变量
err := json.Unmarshal([]byte(jsonBuf), &tmp) //第二个参数要地址传递
if err != nil {
fmt.Println("err = ", err)
return
}
type IT2 struct {
Subjects []string `json:"subjects"` //二次编码
}
var tmp2 IT2
err = json.Unmarshal([]byte(jsonBuf), &tmp2) //第二个参数要地址传递
if err != nil {
fmt.Println("err = ", err)
return
}
fmt.Printf("tmp2 = %+v\n", tmp2)
}
执行结果:
tmp2 = {Subjects:[Go C++ Python Test]}
Go语言结构体转json的坑
json.Marshal()
JSON输出的时候必须注意,只有导出的字段(首字母是大写)才会被输出,如果修改字段名,那么就会发现什么都不会输出,所以必须通过struct tag定义来实现。
针对JSON的输出,我们在定义struct tag的时候需要注意的几点是:
- 字段的tag是"-",那么这个字段不会输出到JSON
- tag中带有自定义名称,那么这个自定义名称会出现在JSON的字段名中
- tag中如果带有"omitempty"选项,那么如果该字段值为空,就不会输出到JSON串中
- 如果字段类型是bool, string, int, int64等,而tag中带有",string"选项,那么这个字段在输出到JSON的时候会把该字段对应的值转换成JSON字符串
代码示例
package main
import (
"encoding/json"
"fmt"
)
func main() {
type UserInfo struct {
Id int
Name string
Address string
}
type Comiket struct {
id int
title string
}
type Test struct {
Id int `json:"-"`
Content string `json:"content"`
IsDel bool `json:",string"`
Type int `json:"type, omitempty"`
}
c := Comiket{1, "AS动漫游戏嘉年华"}
v, error := json.Marshal(c)
fmt.Println(string(v))
fmt.Println(error)
fmt.Println("------------------")
User := UserInfo{1, "taylor", "USA"}
b, err := json.Marshal(User)
fmt.Println(string(b))
fmt.Println(err)
fmt.Println("------------------")
t := Test{Id:1, Content:"hello world", IsDel:true}
val, _ := json.Marshal(t)
fmt.Println(string(val))
}
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2020/06/28 09:01