婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang中使用JSON的一些小技巧分享

Golang中使用JSON的一些小技巧分享

熱門標簽:建造者2地圖標注 惠州電銷防封電話卡 浙江高頻外呼系統多少錢一個月 汕頭小型外呼系統 釘釘有地圖標注功能嗎 黃岡人工智能電銷機器人哪個好 濱州自動電銷機器人排名 鄭州亮點科技用的什么外呼系統 阿里云ai電話機器人

前言

有的時候上游傳過來的字段是string類型的,但是我們卻想用變成數字來使用。 本來用一個json:",string" 就可以支持了,如果不知道golang的這些小技巧,就要大費周章了。

參考文章: JSON and struct composition in Go

臨時忽略struct字段

type User struct {
 Email string `json:"email"`
 Password string `json:"password"`
 // many more fields…
}

臨時忽略掉Password字段

json.Marshal(struct {
 *User
 Password bool `json:"password,omitempty"`
}{
 User: user,
})

臨時添加額外的字段

type User struct {
 Email string `json:"email"`
 Password string `json:"password"`
 // many more fields…
}

臨時忽略掉Password字段,并且添加token字段

json.Marshal(struct {
 *User
 Token string `json:"token"`
 Password bool `json:"password,omitempty"`
}{
 User: user,
 Token: token,
})

臨時粘合兩個struct

type BlogPost struct {
 URL string `json:"url"`
 Title string `json:"title"`
}

type Analytics struct {
 Visitors int `json:"visitors"`
 PageViews int `json:"page_views"`
}

json.Marshal(struct{
 *BlogPost
 *Analytics
}{post, analytics})

一個json切分成兩個struct

json.Unmarshal([]byte(`{
 "url": "attila@attilaolah.eu",
 "title": "Attila's Blog",
 "visitors": 6,
 "page_views": 14
}`), struct {
 *BlogPost
 *Analytics
}{post, analytics})

臨時改名struct的字段

type CacheItem struct {
 Key string `json:"key"`
 MaxAge int `json:"cacheAge"`
 Value Value `json:"cacheValue"`
}

json.Marshal(struct{
 *CacheItem

 // Omit bad keys
 OmitMaxAge omit `json:"cacheAge,omitempty"`
 OmitValue omit `json:"cacheValue,omitempty"`

 // Add nice keys
 MaxAge int `json:"max_age"`
 Value *Value `json:"value"`
}{
 CacheItem: item,

 // Set the int by value:
 MaxAge: item.MaxAge,

 // Set the nested struct by reference, avoid making a copy:
 Value: item.Value,
})

用字符串傳遞數字

type TestObject struct {
 Field1 int `json:",string"`
}

這個對應的json是 {"Field1": "100"}

如果json是 {"Field1": 100} 則會報錯

容忍字符串和數字互轉

如果你使用的是jsoniter,可以啟動模糊模式來支持 PHP 傳遞過來的 JSON。

import "github.com/json-iterator/go/extra"

extra.RegisterFuzzyDecoders()

這樣就可以處理字符串和數字類型不對的問題了。比如

var val string
jsoniter.UnmarshalFromString(`100`, val)

又比如

var val float32
jsoniter.UnmarshalFromString(`"1.23"`, val)

容忍空數組作為對象

PHP另外一個令人崩潰的地方是,如果 PHP array是空的時候,序列化出來是[]。但是不為空的時候,序列化出來的是{"key":"value"} 。 我們需要把 [] 當成 {} 處理。

如果你使用的是jsoniter,可以啟動模糊模式來支持 PHP 傳遞過來的 JSON。

import "github.com/json-iterator/go/extra"

extra.RegisterFuzzyDecoders()

這樣就可以支持了

var val map[string]interface{}
jsoniter.UnmarshalFromString(`[]`, val)

使用 MarshalJSON支持time.Time

golang 默認會把 time.Time 用字符串方式序列化。如果我們想用其他方式表示 time.Time,需要自定義類型并定義 MarshalJSON。

type timeImplementedMarshaler time.Time

func (obj timeImplementedMarshaler) MarshalJSON() ([]byte, error) {
 seconds := time.Time(obj).Unix()
 return []byte(strconv.FormatInt(seconds, 10)), nil
}

序列化的時候會調用 MarshalJSON

type TestObject struct {
 Field timeImplementedMarshaler
}
should := require.New(t)
val := timeImplementedMarshaler(time.Unix(123, 0))
obj := TestObject{val}
bytes, err := jsoniter.Marshal(obj)
should.Nil(err)
should.Equal(`{"Field":123}`, string(bytes))

使用 RegisterTypeEncoder支持time.Time

jsoniter 能夠對不是你定義的type自定義JSON編解碼方式。比如對于 time.Time 可以用 epoch int64 來序列化

import "github.com/json-iterator/go/extra"

extra.RegisterTimeAsInt64Codec(time.Microsecond)
output, err := jsoniter.Marshal(time.Unix(1, 1002))
should.Equal("1000001", string(output))

如果要自定義的話,參見 RegisterTimeAsInt64Codec 的實現代碼

使用 MarshalText支持非字符串作為key的map

雖然 JSON 標準里只支持 string 作為 key 的 map。但是 golang 通過 MarshalText() 接口,使得其他類型也可以作為 map 的 key。例如

f, _, _ := big.ParseFloat("1", 10, 64, big.ToZero)
val := map[*big.Float]string{f: "2"}
str, err := MarshalToString(val)
should.Equal(`{"1":"2"}`, str)

其中 big.Float 就實現了 MarshalText()

使用 json.RawMessage

如果部分json文檔沒有標準格式,我們可以把原始的文本信息用string保存下來。

type TestObject struct {
 Field1 string
 Field2 json.RawMessage
}
var data TestObject
json.Unmarshal([]byte(`{"field1": "hello", "field2": [1,2,3]}`), data)
should.Equal(` [1,2,3]`, string(data.Field2))

使用 json.Number

默認情況下,如果是 interface{} 對應數字的情況會是 float64 類型的。如果輸入的數字比較大,這個表示會有損精度。所以可以 UseNumber() 啟用 json.Number 來用字符串表示數字。

decoder1 := json.NewDecoder(bytes.NewBufferString(`123`))
decoder1.UseNumber()
var obj1 interface{}
decoder1.Decode(obj1)
should.Equal(json.Number("123"), obj1)

jsoniter 支持標準庫的這個用法。同時,擴展了行為使得 Unmarshal 也可以支持 UseNumber 了。

json := Config{UseNumber:true}.Froze()
var obj interface{}
json.UnmarshalFromString("123", obj)
should.Equal(json.Number("123"), obj)

統一更改字段的命名風格

經常 JSON 里的字段名 Go 里的字段名是不一樣的。我們可以用 field tag 來修改。

output, err := jsoniter.Marshal(struct {
 UserName string `json:"user_name"`
 FirstLanguage string `json:"first_language"`
}{
 UserName: "taowen",
 FirstLanguage: "Chinese",
})
should.Equal(`{"user_name":"taowen","first_language":"Chinese"}`, string(output))

但是一個個字段來設置,太麻煩了。如果使用 jsoniter,我們可以統一設置命名風格。

import "github.com/json-iterator/go/extra"

extra.SetNamingStrategy(LowerCaseWithUnderscores)
output, err := jsoniter.Marshal(struct {
 UserName string
 FirstLanguage string
}{
 UserName: "taowen",
 FirstLanguage: "Chinese",
})
should.Nil(err)
should.Equal(`{"user_name":"taowen","first_language":"Chinese"}`, string(output))

使用私有的字段

Go 的標準庫只支持 public 的 field。jsoniter 額外支持了 private 的 field。需要使用 SupportPrivateFields() 來開啟開關。

import "github.com/json-iterator/go/extra"

extra.SupportPrivateFields()
type TestObject struct {
 field1 string
}
obj := TestObject{}
jsoniter.UnmarshalFromString(`{"field1":"Hello"}`, obj)
should.Equal("Hello", obj.field1)

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • golang使用json格式實現增刪查改的實現示例
  • golang json.Marshal 特殊html字符被轉義的解決方法
  • golang結構體與json格式串實例代碼
  • golang如何修改json文件內容的方法示例
  • Golang JSON的進階用法實例講解
  • golang如何自定義json序列化應用詳解
  • golang json性能分析詳解
  • golang中json反序列化可能遇到的問題
  • Golang map如何生成有序的json數據詳解
  • 利用Golang解析json數據的方法示例
  • golang實現sql結果集以json格式輸出的方法
  • Golang 如何解析和生成json

標簽:晉中 阿壩 泰安 昭通 東營 滄州 瀘州 駐馬店

巨人網絡通訊聲明:本文標題《Golang中使用JSON的一些小技巧分享》,本文關鍵詞  Golang,中,使用,JSON,的,一,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang中使用JSON的一些小技巧分享》相關的同類信息!
  • 本頁收集關于Golang中使用JSON的一些小技巧分享的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    色狠狠一区二区三区香蕉| 91精品欧美福利在线观看| 国产不卡视频在线播放| 在线不卡欧美精品一区二区三区| 视频一区视频二区在线观看| 欧美网站大全在线观看| 午夜精品久久久| 国产精品水嫩水嫩| 欧美一卡2卡三卡4卡5免费| 国产综合色产在线精品| 天堂蜜桃一区二区三区| 亚洲日本青草视频在线怡红院 | 亚洲精品免费在线播放| 91首页免费视频| 欧美国产精品中文字幕| 日韩av不卡在线观看| 国产日韩欧美精品在线| 中文文精品字幕一区二区| 欧美性色欧美a在线播放| 3d成人动漫网站| 91污在线观看| 色婷婷综合久久久久中文一区二区| 国产精品亚洲成人| 国产成人啪免费观看软件| 久久免费视频色| 一区二区三区成人| 欧美日韩免费观看一区三区| 国产伦精品一区二区三区免费迷 | 成人午夜免费av| 欧美电影免费观看高清完整版在| 国产精品视频yy9299一区| 久久久久久久综合| 欧美高清一级片在线观看| 久久久久久日产精品| 国产三级久久久| 中文字幕制服丝袜一区二区三区 | 亚洲成人激情综合网| 视频一区中文字幕| 国产一区二区三区在线观看精品| 丁香五精品蜜臀久久久久99网站 | 精品播放一区二区| 国产免费观看久久| 亚洲精品国产精品乱码不99| 亚洲第一狼人社区| 国产专区欧美精品| 日本韩国一区二区三区视频| 欧美一区二区在线不卡| 久久久不卡网国产精品一区| 中文字幕一区二区不卡| 天堂影院一区二区| 成人福利视频在线| 欧美精品丝袜久久久中文字幕| 久久久久久久久蜜桃| 亚洲精品乱码久久久久久久久 | 亚洲三级视频在线观看| 午夜精品久久久久久久99樱桃 | 国产成人一级电影| 91视频91自| 精品国产电影一区二区| 亚洲免费观看高清| 精品一区二区久久久| 色老汉av一区二区三区| 日韩欧美在线综合网| 国产亚洲人成网站| 亚洲人快播电影网| 国内精品在线播放| 欧美猛男gaygay网站| 国产精品欧美久久久久一区二区| 天天色天天操综合| 91蜜桃网址入口| 久久香蕉国产线看观看99| 亚洲一区二区三区视频在线播放| 国产麻豆精品一区二区| 欧美精品欧美精品系列| 亚洲蜜臀av乱码久久精品蜜桃| 国产在线日韩欧美| 91麻豆精品久久久久蜜臀 | 日本美女视频一区二区| 色欧美片视频在线观看| 国产欧美一区二区三区鸳鸯浴| 日本最新不卡在线| 欧美日韩三级在线| 亚洲精品一二三四区| 成人动漫中文字幕| 国产女主播在线一区二区| 国内精品久久久久影院薰衣草| 91精品国产美女浴室洗澡无遮挡| 亚洲午夜电影在线观看| 色婷婷国产精品久久包臀| 国产精品国产三级国产有无不卡 | 调教+趴+乳夹+国产+精品| 北岛玲一区二区三区四区| 国产亚洲va综合人人澡精品| 国产一区在线看| 精品国产乱码久久| 国产成人欧美日韩在线电影| 日韩精品一区二区在线观看| 麻豆国产精品一区二区三区 | 中文字幕在线免费不卡| 成人黄色777网| 国产欧美一区二区三区网站| 粉嫩久久99精品久久久久久夜| 精品国产乱码久久| 国产在线国偷精品免费看| 欧美精品一区二| 国产成人精品一区二区三区网站观看| 久久综合九色综合欧美亚洲| 国产激情精品久久久第一区二区 | 欧美日韩欧美一区二区| 亚洲一区二区三区激情| 欧美另类久久久品| 一区二区三区免费看视频| 欧美性视频一区二区三区| 天堂va蜜桃一区二区三区漫画版| 欧美一区欧美二区| 国产乱理伦片在线观看夜一区| 国产精品国产自产拍高清av| 一本一道久久a久久精品综合蜜臀| 一区av在线播放| 日韩欧美国产1| 成人国产亚洲欧美成人综合网| 亚洲黄一区二区三区| 欧美一区二区三区啪啪| 风间由美中文字幕在线看视频国产欧美| 91精品中文字幕一区二区三区| 玉足女爽爽91| 在线亚洲人成电影网站色www| 日韩av电影免费观看高清完整版 | 国产综合成人久久大片91| 国产日本欧洲亚洲| 91老师片黄在线观看| 蜜臀av性久久久久蜜臀aⅴ| 国产视频亚洲色图| 欧美制服丝袜第一页| 久久av中文字幕片| 亚洲免费三区一区二区| 日韩一级二级三级| 成人18视频在线播放| 午夜精品久久久久久久| 久久久久免费观看| 欧美日韩国产精品成人| 成人精品免费视频| 久久99久国产精品黄毛片色诱| 亚洲精品写真福利| 久久久久久久综合| 欧美亚洲精品一区| 国产jizzjizz一区二区| 免费观看一级特黄欧美大片| 亚洲视频小说图片| 久久久电影一区二区三区| 91精品蜜臀在线一区尤物| 91丨porny丨首页| 国产suv精品一区二区6| 狠狠狠色丁香婷婷综合激情| 亚洲第一在线综合网站| 亚洲精品免费看| 亚洲欧美怡红院| 国产精品久久久久久久久免费樱桃| 欧美成人video| 3d动漫精品啪啪一区二区竹菊| 在线观看视频欧美| 99精品1区2区| 精品午夜久久福利影院| 日本亚洲电影天堂| 视频精品一区二区| 亚洲国产sm捆绑调教视频| 亚洲免费av在线| 夜夜嗨av一区二区三区网页 | 国产九九视频一区二区三区| 日韩黄色片在线观看| 亚洲bt欧美bt精品777| 一区二区三区四区乱视频| 国产精品久久777777| 国产女主播一区| 国产精品超碰97尤物18| 中文字幕在线观看一区二区| 中日韩免费视频中文字幕| 欧美激情资源网| 国产精品视频看| 中文字幕中文在线不卡住| 亚洲欧洲一区二区三区| 中文字幕在线观看一区二区| 中文字幕乱码日本亚洲一区二区| 国产欧美一区视频| 最新久久zyz资源站| 亚洲视频在线观看一区| 亚洲综合久久久| 日本视频一区二区| 狠狠色狠狠色合久久伊人| 国产999精品久久| 色综合一区二区| 欧美电影一区二区| 日韩精品中文字幕一区二区三区 | 国产一区二区三区最好精华液| 国内精品国产三级国产a久久| 国产精品一区二区三区乱码| 波多野结衣在线一区| 色88888久久久久久影院野外| 欧美日韩国产高清一区二区三区 | 91精品福利在线一区二区三区 |