两个核心函数Marshal Unmarshal
结构体转json
func test1() {
type ColorGroup struct {
ID int
Name string
Colors []string
}
group := ColorGroup{
ID: 1,
Name: "Reds",
Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}
fmt.Printf("group: %v\n", group)
fmt.Printf("group: %+v\n", group)
b, err := json.Marshal(group)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("string(b): %v\n", string(b))
}
%v和%+v区别注意!!!
json转结构体
func test2() {
// var jsonBlob = []byte(`[{"Name": "Platypus", "Order": "Monotremata"},{"Name": "Quoll", "Order": "Dasyuromorphia"}]`)
var jsonBlob = []byte(`{"Name": "Quoll", "Order": "Dasyuromorphia"}`)
type Animal struct {
Name string
Order string
}
// 注意这块定义是数组
// var animals []Animal
var animals Animal
err := json.Unmarshal(jsonBlob, &animals)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v\n", animals)
}
注意注释的代码打开运行进行对面
json解析后遍历(注意定义的p区别)
func test3() {
type ColorGroup struct {
ID int
Name string
Colors []string
}
var b = []byte(`{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}`)
var p ColorGroup
json.Unmarshal(b, &p)
fmt.Printf("p: %v\n", p)
fmt.Printf("p.ID: %v\n", p.ID)
fmt.Printf("p.Name: %v\n", p.Name)
for k, v := range p.Colors {
fmt.Println(k, "=", v)
}
}
func test4() {
var b = []byte(`{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}`)
var p map[string]interface{}
json.Unmarshal(b, &p)
fmt.Printf("p: %v\n", p)
for k, v := range p {
fmt.Println(k, "=", v)
}
}
打开json文件读取数据,json写入文件
func test5() {
f, _ := os.Open("a.json")
defer f.Close()
d := json.NewDecoder(f)
var p map[string]interface{}
d.Decode(&p)
fmt.Printf("p: %v\n", p)
for k, v := range p {
fmt.Println(k, "=", v)
}
}
func test6() {
f, _ := os.Open("b.json")
defer f.Close()
d := json.NewDecoder(f)
var p []map[string]interface{}
d.Decode(&p)
fmt.Printf("p: %v\n", p)
for k, v := range p {
fmt.Println(k, "=", v)
for k1, v1 := range v {
fmt.Println(k1, "=", v1)
}
}
}
func test7() {
type ColorGroup struct {
ID int
Name string
Colors []string
}
group := ColorGroup{
ID: 1,
Name: "Reds",
Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}
f, _ := os.OpenFile("a1.json", os.O_RDWR|os.O_CREATE, 0777)
defer f.Close()
e := json.NewEncoder(f)
e.Encode(group)
}
func test8() {
type ColorGroup struct {
ID int
Name string
Colors []string
}
group1 := ColorGroup{
ID: 1,
Name: "Reds",
Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}
group2 := ColorGroup{
ID: 1,
Name: "Reds",
Colors: []string{"Crimson", "Red", "Ruby", "Maroon"},
}
group := []ColorGroup{group1, group2}
f, _ := os.OpenFile("b1.json", os.O_RDWR|os.O_CREATE, 0777)
defer f.Close()
e := json.NewEncoder(f)
e.Encode(group)
}
运行结果(仔细对比你会发现四个函数两两对应哦)
以下是读取和写入的json文件
a.json(读取一个结构体)
{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}
b.json(读取切片结构体)
[{"Name": "Platypus", "Order": "Monotremata"},{"Name": "Quoll", "Order": "Dasyuromorphia"}]
a1.json(写入一个结构体)
{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}
b1.json(写入切片结构体)
[{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]},{"ID":1,"Name":"Reds","Colors":["Crimson","Red","Ruby","Maroon"]}]