<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
JSON是一種輕量級的資料交換格式。易於閱讀和編寫。 golang 提供了 encoding/json 包來操作JSON資料。
(1)使用 json.Marshal() 方法,把結構體轉成 JSON字串
import ( "encoding/json" "fmt" ) type Student struct { Name string Age int Skill string } func main() { stu := Student{"tom", 12, "football"} data, err := json.Marshal(&stu) if err != nil { fmt.Printf("序列化錯誤 err=%vn", err) return } fmt.Println("序列化後: ", string(data)) }
列印: 序列化後: {“Name”:“tom”,“Age”:12,“Skill”:“football”}
(2)JSON字串 轉 結構體,可以使用 json.Unmarshal()方法
func main() { str := `{"Name":"tom","Age":12,"Skill":"football"}` var stu2 Student err := json.Unmarshal([]byte(str), &stu2) if err != nil { fmt.Printf("反序列化錯誤 err=%vn", err) return } fmt.Printf("反序列化後: Student=%v, Name=%vn", stu2, stu2.Name) }
列印: 反序列化後: Student={tom 12 football}, Name=tom
(3)如何實現結構體序列化後key的名稱能自定義
對於自定義key的名稱,可以給 struct變數指定一個tag標籤
type Student struct { Name string `json:"stu_name"` Age int `json:"stu_age"` Skill string // 也可以不指定 tag標籤,預設就是 變數名稱 } func main() { stu := Student{"tom", 12, "football"} data, err := json.Marshal(&stu) if err != nil { fmt.Printf("序列化錯誤 err=%vn", err) return } fmt.Println("序列化後: ", string(data)) }
列印後,可以看到 key的名稱已經變成了我們指定的 tag標籤 的名稱
序列化後: {“stu_name”:“tom”,“stu_age”:12,“Skill”:“football”}
func main() { // map 轉 Json字串 m := make(map[string]interface{}) m["name"] = "jetty" m["age"] = 16 data, err := json.Marshal(&m) if err != nil { fmt.Printf("序列化錯誤 err=%vn", err) return } fmt.Println("序列化後: ", string(data)) // 列印: 序列化後: {"age":16,"name":"jetty"} // Json字串 轉 map str := `{"age":25,"name":"car"}` err = json.Unmarshal([]byte(str), &m) if err != nil { fmt.Printf("反序列化錯誤 err=%vn", err) return } fmt.Printf("反序列化後: map=%v, name=%vn", m, m["name"]) // 列印: 反序列化後: map=map[age:25 name:car], name=car }
如果變數首字母小寫,則為private。因為取不到反射資訊,不能轉。
如果變數首字母大寫,則為public。不管加不加 tag 都能正常轉,加了tag的變數就按照tag的名稱顯示。
範例:
type User struct { Name string `json:"u_name"` age int `json:"u_age"` Skill string // 也可以不指定 tag標籤,預設就是 變數名稱 addr string } func main() { user := User{"admin", 23, "football", "上海"} data, err := json.Marshal(&user) if err != nil { fmt.Printf("序列化錯誤 err=%vn", err) return } fmt.Println("序列化後: ", string(data)) // 列印: 序列化後: {"u_name":"admin","Skill":"football"} }
通過列印,我們發現小寫的變數,如 age、addr 都沒有轉成 json資料。
總結:
首字母小寫的不管加不加tag都不能轉為json資料,而大寫的加了tag可以取別名,不加tag則json內的欄位跟結構體變數原名一致
type User struct { Name string `json:"u_name"` Password string `json:"password"` Email string `json:"email"` } func main() { user := User{"admin", "pwd", "user@163.com"} person := Person{23, "上海"} // 忽略掉 Password 欄位 data, _ := json.Marshal(struct { *User Password string `json:"password,omitempty"` }{User: &user}) fmt.Println("忽略欄位: ", string(data)) // 列印: 忽略欄位: {"u_name":"admin","email":"user@163.com"} }
忽略欄位: {“u_name”:“admin”,“email”:“user@163.com”}}
data, _ = json.Marshal(struct { *User Skill string `json:"skill"` // 臨時新增額外的 Skill欄位 }{ User: &user, Skill: "football", }) fmt.Println("新增額外欄位: ", string(data))
新增額外欄位: {“u_name”:“admin”,“password”:“pwd”,“email”:“user@163.com”,“skill”:“football”}
type User struct { Name string `json:"u_name"` Password string `json:"password"` Email string `json:"email"` } type Person struct { Age int Addr string `json:"addr"` } func main() { // 初始化兩個 struct user := User{"admin", "pwd", "user@163.com"} person := Person{23, "上海"} data, _ := json.Marshal(struct { *User *Person }{ User: &user, Person: &person, }) fmt.Println("合併兩個struct: ", string(data)) }
合併兩個struct: {“u_name”:“admin”,“password”:“pwd”,“email”:“user@163.com”,“Age”:23,“addr”:“上海”}
emp := struct { // 建立匿名 struct Num int `json:"num,string"` }{15,} data, _ := json.Marshal(&emp) fmt.Println("數位轉成字串: ", string(data)) // 數位轉成字串: {"num":"15"} str := `{"Num":"25"}` _ = json.Unmarshal([]byte(str), &emp) fmt.Printf("字串轉成數位: Emp.Num=%vn", emp.Num) // 字串轉成數位: Emp.Num=25
str = ` {"u_name":"system","password":"abc","email":"user2@163.com","Age":23,"addr":"杭州"}` var user2 User var person2 Person _ := json.Unmarshal([]byte(str), &struct { *User *Person }{ User: &user2, Person: &person2, }) fmt.Printf("分成兩個struct: User=%v, Person=%vn", user2, person2)
分成兩個struct: User={system abc user2@163.com}, Person={23 杭州}
簡單記錄一下go語言json格式化輸出的辦法
import ( "bytes" "encoding/json" "fmt" "os" ) type Complex_Type struct{ Age int `json:"age"` Name string `json:"name"` Grades map[string]int `json:"grade"` Parents []string `json:"parents"` } grades := map[string]int{ "math" : 96, "chinese" : 87, "english" : 93, } parents := []string{ "minato", "kushina", } complex_type := Complex_Type{ Age: 18, Name: "Naruto", Grades : grades, Parents: parents, } res,err := json.Marshal(complex_type) exitOnError(err) var out bytes.Buffer err = json.Indent(&out,res,"","t") out.WriteTo(os.Stdout) fmt.Printf("n")
輸出:
到此這篇關於golang中json操作的文章就介紹到這了,更多相關golang json操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45