golang-web: struct結(jié)構(gòu)體轉(zhuǎn)成JSON

Go_14:GoLang中 json荠雕、map啦辐、struct 之間的相互轉(zhuǎn)化
https://www.cnblogs.com/liang1101/p/6741262.html

golang中struct、json、map互相轉(zhuǎn)化

2018年05月07日 23:14:14 小拳頭 閱讀數(shù):7354

<article class="baidu_pl" style="box-sizing: inherit; outline: 0px; display: block; position: relative; padding-top: 16px;">

版權(quán)聲明:本文為博主原創(chuàng)文章槽袄,轉(zhuǎn)載請(qǐng)標(biāo)明原文地址,謝謝 _ https://blog.csdn.net/xiaoquantouer/article/details/80233177

一锋谐、Json和struct互換

(1)Json轉(zhuǎn)struct例子:

package main import (        "fmt"        "encoding/json") type People struct {        Name string `json:"name_title"`        Age int `json:"age_size"`} func JsonToStructDemo(){        jsonStr := `        {                "name_title": "jqw"                "age_size":12        }        `        var people People        json.Unmarshal([]byte(jsonStr), &people)        fmt.Println(people)} func main(){        JsonToStructDemo()}

輸出:

image

注意json里面的key和struct里面的key要一致遍尺,struct中的key的首字母必須大寫(xiě),而json中大小寫(xiě)都可以涮拗。

(2)struct轉(zhuǎn)json

    在結(jié)構(gòu)體中引入tag標(biāo)簽乾戏,這樣匹配的時(shí)候json串對(duì)應(yīng)的字段名需要與tag標(biāo)簽中定義的字段名匹配,當(dāng)然tag中定義的名稱(chēng)不需要首字母大寫(xiě)多搀,且對(duì)應(yīng)的json串中字段名仍然大小寫(xiě)不敏感歧蕉。此時(shí),結(jié)構(gòu)體中對(duì)應(yīng)的字段名可以不用和匹配的一致康铭,但是首字母必須大寫(xiě)惯退,只有大寫(xiě)才是可對(duì)外提供訪問(wèn)的。

例子:

package main import (        "fmt"        "encoding/json") type People struct {        Name string `json:"name_title"`        Age int `json:"age_size"`} func StructToJsonDemo(){        p := People{                Name: "jqw",                Age: 18,        }         jsonBytes, err := json.Marshal(p)        if err != nil {                fmt.Println(err)        }        fmt.Println(string(jsonBytes))} func main(){        StructToJsonDemo()}

輸出:

image

二从藤、json和map互轉(zhuǎn)

(1)json轉(zhuǎn)map例子:

func JsonToMapDemo(){        jsonStr := `        {                "name": "jqw",                "age": 18        }        `        var mapResult map[string]interface{}        err := json.Unmarshal([]byte(jsonStr), &mapResult)        if err != nil {                fmt.Println("JsonToMapDemo err: ", err)        }        fmt.Println(mapResult)}

輸出:

image

(2)map轉(zhuǎn)Json例子

func MapToJsonDemo1(){        mapInstances := []map[string]interface{}{}        instance_1 := map[string]interface{}{"name": "John", "age": 10}        instance_2 := map[string]interface{}{"name": "Alex", "age": 12}        mapInstances = append(mapInstances, instance_1, instance_2)         jsonStr, err := json.Marshal(mapInstances)         if err != nil {                fmt.Println("MapToJsonDemo err: ", err)        }        fmt.Println(string(jsonStr))}

輸出:

image

例2:

func MapToJsonDemo2(){        b, _ := json.Marshal(map[string]int{"test":1, "try":2})        fmt.Println(string(b))}

輸出:

image

三催跪、map和struct互轉(zhuǎn)

(1)map轉(zhuǎn)struct

需要安裝一個(gè)第三方庫(kù)

在命令行中運(yùn)行: go get github.com/goinggo/mapstructure

例子:

func MapToStructDemo(){        mapInstance := make(map[string]interface{})        mapInstance["Name"] = "jqw"        mapInstance["Age"] = 18         var people People        err := mapstructure.Decode(mapInstance, &people)        if err != nil {                fmt.Println(err)        }        fmt.Println(people)}

輸出

image

(2)struct轉(zhuǎn)map例子

func StructToMapDemo(obj interface{}) map[string]interface{}{        obj1 := reflect.TypeOf(obj)        obj2 := reflect.ValueOf(obj)         var data = make(map[string]interface{})        for i := 0; i < obj1.NumField(); i++ {                data[obj1.Field(i).Name] = obj2.Field(i).Interface()        }        return data}func TestStructToMap(){        student := Student{10, "jqw", 18}        data := StructToMapDemo(student)        fmt.Println(data)}

輸出:

image

#############
map轉(zhuǎn)json
ptoken, _ := ParseToken(authtoken, []byte(JwtSecret))
fmt.Println("ptoken.Valid():",ptoken.Valid())
fmt.Println("token Claims:", ptoken)
tokenbyte,_:=json.Marshal(ptoken)
tokenstr:=string(tokenbyte)
fmt.Println(tokenstr)

//結(jié)構(gòu)體首字母必須大寫(xiě)
func main() {
app := iris.New()
app.Get("/", get)
app.Run(iris.Addr(":8080"))
}

type str struct {
Av string json:"av"
Bv int json:"bv"
}

func get(ctx iris.Context) {
strv:=str{Av:"abc",Bv:555}
jsons,_:=json.Marshal(strv)
json.Unmarshal(jsons,&strv)
ctx.JSON(strv)
}

    type header struct {
        Encryption  string `json:"encryption"`
        Timestamp   int64  `json:"timestamp"`
        Key         string `json:"key"`
        Partnercode int    `json:"partnercode"`
    }

    //轉(zhuǎn)換成JSON字符串
    headerO1 := header{
        Encryption:  "sha",
        Timestamp:   1482463793,
        Key:         "2342874840784a81d4d9e335aaf76260",
        Partnercode: 10025,
    }
    //jsons, _ := json.MarshalIndent(headerO1,"","") //轉(zhuǎn)換成JSON返回的是byte[]
    jsons,_:=json.Marshal(headerO1)
    
    fmt.Println(string(jsons)) //  <--轉(zhuǎn)成string輸出
    var data header
    //json.Unmarshal([]byte(jsons),&data)
    json.Unmarshal(jsons,&data)
    fmt.Println(string(jsons))

    ctx.JSON(data)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夫嗓,一起剝皮案震驚了整個(gè)濱河市将饺,隨后出現(xiàn)的幾起案子拥峦,更是在濱河造成了極大的恐慌车伞,老刑警劉巖码邻,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佃蚜,死亡現(xiàn)場(chǎng)離奇詭異霎冯,居然都是意外死亡恭取,警方通過(guò)查閱死者的電腦和手機(jī)妒貌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)通危,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人灌曙,你說(shuō)我怎么就攤上這事菊碟。” “怎么了在刺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵逆害,是天一觀的道長(zhǎng)头镊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)魄幕,這世上最難降的妖魔是什么相艇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮梅垄,結(jié)果婚禮上厂捞,老公的妹妹穿的比我還像新娘。我一直安慰自己队丝,他們只是感情好靡馁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著机久,像睡著了一般臭墨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上膘盖,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天胧弛,我揣著相機(jī)與錄音,去河邊找鬼侠畔。 笑死结缚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的软棺。 我是一名探鬼主播红竭,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼喘落!你這毒婦竟也來(lái)了茵宪?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘦棋,失蹤者是張志新(化名)和其女友劉穎稀火,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體赌朋,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凰狞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沛慢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片服球。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖颠焦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情往枣,我是刑警寧澤伐庭,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布粉渠,位于F島的核電站,受9級(jí)特大地震影響圾另,放射性物質(zhì)發(fā)生泄漏霸株。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一集乔、第九天 我趴在偏房一處隱蔽的房頂上張望去件。 院中可真熱鬧,春花似錦扰路、人聲如沸尤溜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宫莱。三九已至,卻和暖如春哩罪,著一層夾襖步出監(jiān)牢的瞬間授霸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工际插, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碘耳,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓框弛,卻偏偏與公主長(zhǎng)得像辛辨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子功咒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容