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) }
 
   |