Golang中JSON解析結構體

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

一、StructTag介紹

StructTag是go語言結構體中的一個標記欄位,放在欄位聲明的後面,一般只有特定情況下會用到,如json的轉化。

使用的時候只要把標記的欄位用兩個包起來即可,標籤內的文法形式通常為key:”value”` ,多個標記用空格隔開。

1
2
3
4
type tagTest struct {
tagA string `TagA`
tagB int `TagB`
}

二、Struct轉Json

要想把struct轉化成json,只要把結構體內的欄位名設定成匯出狀態,也就是把首字母大寫就行了,預設情況下,轉化後的json中的key值和結構體中的欄位名是一樣的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main
import (
"fmt"
"encoding/json"
)
type addr struct {
Province string
City string
}
type stu struct {
Name string
Age int
Addr addr
}
func main(){
var xm = stu{Name:"xiaoming", Age:18, Addr:addr{Province:"Hunan",City:"ChangSha"}}
js, err := json.Marshal(xm)
if err != nil{
fmt.Println(err)
return
}
fmt.Println(string(js)) //輸出{"Name":"xiaoming","Age":18,"Addr":{"Province":"Hunan","City":"ChangSha"}}
}

三、Json轉struct

而在把json轉化成struct的時候,要求json和結構體的欄位一致才能被成功轉化,否則轉化後的資料就可能和我們想的不一樣。

要注意的是這裡可以忽略大小寫。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package main
import (
"fmt"
"encoding/json"
)
type addr struct {
Province string
City string
}
type stu struct {
Name string
Age int
Addr addr
}
func main(){
js := `{"Age":18,"name":"xiaoming","Addr":{"Province":"Hunan","City":"ChangSha"}}` //name是小寫
var xm stu
err := json.Unmarshal([]byte(js), &xm)
if err != nil{
fmt.Println(err)
return
}
fmt.Println(xm) //輸出{xiaoming 18 {Hunan ChangSha}}
}

四、使用tag

以上都沒有tag就能相互轉化,說起來好像tag並沒有什麼用!事實的確也就是這樣,tag其實在這裡並不是必需的。

但如果我們期望轉化後的json欄位名和struct裡的不一樣的話,就得用到tag了。

tag在這裡的用途就是提供別名,讓兩者的轉化更加靈活。

tag的使用格式為json:"***" 、‘(***我們期望json轉化過後的名字)

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
package main
import (
"fmt"
"encoding/json"
)
type addr struct {
Province string `json:"province"` //轉化後對應欄位的json名為province
City string `json:"city"`
}
type stu struct {
Name string `json:"name"`
Age int `json:"age"`
Addr addr `json:"addr"`
}
func main(){
var xm = stu{Name: "xiaoming", Age: 18, Addr:addr{Province:"Hunan",City:"ChangSha"}}
js, err := json.Marshal(xm)
if err != nil{
fmt.Println(err)
return
}
fmt.Println(string(js))
var xxm stu
err = json.Unmarshal(js, & xxm)
fmt.Println(xxm)
}

輸出:

1
2
{"name":"xiaoming","age":18,"addr":{"province":"Hunan","city":"ChangSha"}}//轉化的時候會按照我們指定的名字來轉
{xiaoming 18 {Hunan ChangSha}}//反過來也是一樣
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.