校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 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精品国产综合久久精品麻豆| 成人18视频日本| 国产在线精品一区二区不卡了| 一区二区三区中文字幕精品精品| 一区二区三区中文字幕精品精品 | 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 国产一区久久久| 激情深爱一区二区| 国产成人日日夜夜| 成人亚洲一区二区一| 9人人澡人人爽人人精品| 成人黄色网址在线观看| 色哟哟一区二区| 欧美撒尿777hd撒尿| 欧美一区二区三区四区久久 | 午夜久久久久久久久| 天堂va蜜桃一区二区三区 | 宅男在线国产精品| 欧美tickling挠脚心丨vk| 久久久青草青青国产亚洲免观| 国产欧美日韩不卡| 亚洲女人小视频在线观看| 亚洲自拍偷拍欧美| 美脚の诱脚舐め脚责91| 国产一区二区精品久久| jlzzjlzz亚洲女人18| 欧洲亚洲国产日韩| 欧美一区二区三区四区高清| 国产日韩高清在线| 亚洲精品中文字幕乱码三区 | 欧美老女人在线| 精品国产网站在线观看| 国产精品午夜免费| 亚洲成人在线免费| 国产一区 二区 三区一级| 99久久精品免费精品国产| 欧美性欧美巨大黑白大战| 在线成人av影院| 国产午夜亚洲精品理论片色戒| 一区二区三区免费看视频| 免费黄网站欧美| 国产精品夜夜爽| 精品视频一区三区九区| 精品女同一区二区| 亚洲欧美视频一区| 久久99精品久久久久| 91在线视频播放地址| 日韩欧美卡一卡二| 亚洲精选视频在线| 国产综合久久久久影院| 91福利在线导航| 欧美激情资源网| 免费欧美在线视频| 91蝌蚪porny| 久久久91精品国产一区二区精品| 一区二区三区中文字幕精品精品| 国产永久精品大片wwwapp | 国产精品蜜臀在线观看| 亚洲高清视频在线| av男人天堂一区| 日韩精品一区在线| 亚洲一区免费视频| 欧美一级爆毛片| 九色porny丨国产精品| 欧美性一二三区| heyzo一本久久综合| 在线视频一区二区免费| www国产成人| 奇米影视一区二区三区小说| 91麻豆精东视频| 日本一区二区三区高清不卡| 免费成人性网站| 欧美性做爰猛烈叫床潮| 亚洲欧洲韩国日本视频| 国产成人精品免费在线| 日韩一级黄色片| 亚洲第一激情av| 色哟哟日韩精品| 国产精品国产三级国产普通话三级| 青青草97国产精品免费观看无弹窗版| 91小视频免费观看| 国产精品三级视频| 国内精品国产三级国产a久久| 777奇米成人网| 亚洲1区2区3区4区| 一本大道av一区二区在线播放| 国产精品久久久久久久蜜臀| 国产一区二区三区久久久| 日韩欧美成人一区| 久久国产麻豆精品| 欧美一区二区三级| 日韩精品每日更新| 69精品人人人人| 亚洲福利视频导航| 欧美中文字幕一二三区视频| 亚洲免费色视频| 97精品久久久久中文字幕 | 中文字幕五月欧美| 成人一区二区三区视频| 久久精品夜色噜噜亚洲aⅴ| 韩国精品主播一区二区在线观看| 日韩欧美国产电影| 国产一区二区三区免费| 国产网站一区二区| 国产999精品久久久久久| 国产欧美一区二区精品性| 国产成人亚洲精品狼色在线| 国产亚洲人成网站| 成人性生交大合| 最新日韩av在线| 欧美少妇xxx| 1000精品久久久久久久久| 欧美激情在线观看视频免费| av一区二区三区四区| 中文av字幕一区| 91天堂素人约啪| 亚洲一区二区三区美女| 6080yy午夜一二三区久久| 奇米色一区二区| 国产视频视频一区| 成人av网站大全| 亚洲在线成人精品| 日韩一区二区在线播放| 国产精品99精品久久免费| 最新成人av在线| 欧洲激情一区二区| 青青青爽久久午夜综合久久午夜 | 综合色中文字幕| 精品1区2区3区| 美女一区二区视频| 中文字幕成人网| 欧美在线观看禁18| 国产曰批免费观看久久久| 亚洲丝袜精品丝袜在线| 欧美日韩国产片| 黄色日韩三级电影| 亚洲人成网站色在线观看| 欧美久久久久久久久| 国产乱码精品一品二品| 亚洲天堂2014| 欧美一级欧美一级在线播放| 国产成人欧美日韩在线电影| 夜夜爽夜夜爽精品视频| 精品日韩欧美在线| 91毛片在线观看| 久久国产三级精品| 亚洲欧美日韩国产手机在线 | 1024亚洲合集| 日韩一区二区三| 91免费观看在线| 久久精品国产精品亚洲综合| 国产精品麻豆一区二区| 91精品婷婷国产综合久久性色| 国产69精品久久久久毛片| 性欧美疯狂xxxxbbbb| 亚洲国产精品高清| 91精品国产色综合久久不卡电影 | 麻豆国产一区二区| 亚洲精品菠萝久久久久久久| 欧美本精品男人aⅴ天堂| 一本到不卡免费一区二区| 国产在线精品一区二区不卡了| 亚洲国产精品久久一线不卡| 日本一区二区三区国色天香| 欧美一区二区三级| 在线观看国产一区二区| 成人中文字幕合集| 免费xxxx性欧美18vr| 一区二区三区中文字幕| 国产视频一区不卡| 精品国产伦一区二区三区观看体验 | 国产 欧美在线| 欧美aa在线视频| 亚洲成人午夜电影| 亚洲精品老司机| 国产精品国产三级国产aⅴ入口 | 亚洲综合色成人| 欧美日韩一区高清| 国产大陆精品国产| 一区二区三区四区激情| 久久久精品综合| 日韩欧美高清dvd碟片| 欧美剧情电影在线观看完整版免费励志电影 | 麻豆精品视频在线| 亚洲一区在线免费观看| 国产精品国产自产拍高清av王其| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美一区二区三区在线视频| 欧美亚洲综合一区| 色婷婷综合久久久久中文 | 国产精品免费视频一区| 国产日韩在线不卡| 久久久99精品免费观看不卡| 欧美刺激脚交jootjob| 日韩免费视频线观看|