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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| package main
import ( "encoding/json" "fmt" "log" )
type Moive struct { Title string Year int `json:"released"` // Tag元信息,编码时重命名key Color bool `json:"color,omitempty"` // omitempty表示结构体成员为空或零值时不生成该JSON对象 Actors []string }
var movies = []Moive{ {Title: "战狼2", Year: 2017, Color: true, Actors: []string{"吴京", "吴刚"}}, {Title: "老炮儿", Year: 2015, Color: true, Actors: []string{"冯小刚", "吴亦凡", "许晴"}}, {Title: "Bullitt", Year: 1968, Color: false, Actors: []string{"Steve McQueen", "Jacqueline Bi sset"}}, }
func main() { // json紧凑格式 json_str, err := json.Marshal(movies)
// 格式化的json,后两参数表示每一行输出的前缀和每一个层级的缩进 // json_str, err := json.MarshalIndent(movies, "", " ") if err != nil { log.Fatal(err) return }
fmt.Printf("%s\n", json_str)
fmt.Println("-----------------")
var titles []struct { Title string } if err := json.Unmarshal(json_str, &titles); err != nil { log.Fatal(err) return } fmt.Printf("Titles: %+v\n", titles)
/* 注意 json 编解码 只能处理结构体成员变量是大写的字段,小写的直接忽略 如果在编码时, 想让json字符串的字段小写,那么需要再结构体中加Tag 如果再解码时, json有小写的字段名,那么在定义结构体接收的时候,成员名要大写,然后也要加Tag */ var my_movies []struct { Title string Year int `json:"released"` Actors []string } if err := json.Unmarshal(json_str, &my_movies); err != nil { log.Fatal(err) return }
fmt.Printf("movies: %+v\n", movies) }
|