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

主頁 > 知識庫 > go json轉換實踐中遇到的坑

go json轉換實踐中遇到的坑

熱門標簽:江西轉化率高的羿智云外呼系統 學海導航地圖標注 廣州呼叫中心外呼系統 南通如皋申請開通400電話 浙江高速公路地圖標注 中國地圖標注省會高清 地圖標注的汽車標 西部云谷一期地圖標注 高德地圖標注口訣

在使用 go 語言開發過程中,經常需要使用到 json 包來進行 json 和 struct 的互相轉換,在使用過程中,遇到了一些需要額外注意的地方,記錄如下。

整數變浮點數問題

假設有一個 Person 結構,其中包含 Age int64 和 Weight float64 兩個字段,現在通過 json 包將 Person 結構轉為 map[string]interface{},代碼如下。

type Person struct {
 Name string
 Age int64
 Weight float64
}

func main() {
 person := Person{
  Name: "Wang Wu",
  Age: 30,
  Weight: 150.07,
 }

 jsonBytes, _ := json.Marshal(person)
 fmt.Println(string(jsonBytes))

 var personFromJSON interface{}
 json.Unmarshal(jsonBytes, personFromJSON)

 r := personFromJSON.(map[string]interface{})
}

代碼執行到這里看上去一切正常,但是打印一下 map[string]interface{} 就會發現不太對了。

fmt.Println(reflect.TypeOf(r["Age"]).Name()) // float64
fmt.Println(reflect.TypeOf(r["Weight"]).Name()) // float64

轉換成 map[string]interface{} 之后,原先的 uint64 和 float64 類型都被轉換成了 float64 類型,這顯然是不符合我們的預期的。

查看 json 的規范可以看到,在 json 中是沒有整型和浮點型之分的,所以現在可以理解 json 包中的 Unmarshal 方法轉出的數字類型為什么都是 float64 了,因為根據 json 規范,數字都是同一種類型,那么對應到 go 的類型中最接近的就是 float64 了。

json 包還針對這個問題提供了更好的解決方案,不過需要使用 json.Decoder 來代替 json.Unmarshal 方法,將 json.Unmarhsal 替換如下。

var personFromJSON interface{}

decoder := json.NewDecoder(bytes.NewReader(jsonBytes))
decoder.UseNumber()
decoder.Decode(personFromJSON)

r := personFromJSON.(map[string]interface{})

這種方法首先創建了一個 jsonDecoder,然后調用了 UseNumber 方法,從文檔中可以知道,使用 UseNumber 方法后,json 包會將數字轉換成一個內置的 Number 類型(而不是 float64),這個 Number 類型提供了轉換為 int64、float64 等多個方法。

 

時間格式

對于 json 格式,是沒有時間類型的,日期和時間以 json 格式存儲時,需要轉換為字符串類型。這就帶來了一個問題,日期時間的字符串表示有多種多樣,go 的 json 包支持的是哪一種呢?

使用下面的代碼來輸出 json.Marshal 方法將 Time 類型轉換為字符串后的格式。

type Person struct {
 Name string
 Birth time.Time
}

func main() {
 person := Person{
  Name: "Wang Wu",
  Birth: time.Now(),
 }

 jsonBytes, _ := json.Marshal(person)
 fmt.Println(string(jsonBytes)) // {"Name":"Wang Wu","Birth":"2018-12-20T16:22:02.00287617+08:00"}
}

根據輸出可以判斷,go 的 json 包使用的是 RFC3339 標準中定義的格式。接下來測試一下 json.Unmarshal 方法所支持的日期時間格式。

dateStr := "2018-10-12"

var person Person
jsonStr := fmt.Sprintf("{\"name\":\"Wang Wu\", \"Birth\": \"%s\"}", dateStr)
json.Unmarshal([]byte(jsonStr), person)

fmt.Println(person.Birth) // 0001-01-01 00:00:00 +0000 UTC

對于形如 2018-10-12 的字符串,json 包并沒有成功將其解析,接下來我們把 time 包中支持的所有格式都試一下。

經過試驗,發現 json.Unmarshal 方法只支持 RFC3339 和 RFC3339Nano 兩種格式的轉換。還有一個需要注意的地方,使用 time.Now() 生成的時間是帶有一個 Monotonic Time 的,經過 json.Marshal 轉換時候,由于 RFC3339 規范里沒有存放 Monotonic Time 的位置,會丟掉這一部分。

對于字段為空的處理

json 包對于空值的處理是一個非常容易出錯的地方,看下面代碼。

type Person struct {
 Name  string
 Age  int64
 Birth time.Time
 Children []Person
}

func main() {
 person := Person{}

 jsonBytes, _ := json.Marshal(person)
 fmt.Println(string(jsonBytes)) // {"Name":"","Age":0,"Birth":"0001-01-01T00:00:00Z","Children":null}
}

當 struct 中的字段沒有值時,使用 json.Marshal 方法并不會自動忽略這些字段,而是根據字段的類型輸出了他們的默認空值,這往往和我們的預期不一致,json 包提供了對字段的控制手段,我們可以為字段增加 omitempty tag,這個 tag 會在字段值為零值(int 和 float 類型零值是 0,string 類型零值是 "",對象類型零值是 nil)時,忽略該字段。

type PersonAllowEmpty struct {
 Name  string    `json:",omitempty"`
 Age  int64    `json:",omitempty"`
 Birth time.Time   `json:",omitempty"`
 Children []PersonAllowEmpty `json:",omitempty"`
}

func main() {
 person := PersonAllowEmpty{}
 jsonBytes, _ := json.Marshal(person)
 fmt.Println(string(jsonBytes)) // {"Birth":"0001-01-01T00:00:00Z"}
}

可以看到,這次輸出的 json 中只有 Birth 字段了,string、int、對象類型的字段,都因為沒有賦值,默認是零值,所以被忽略,對于日期時間類型,由于不可以設置為零值,也就是 0000-00-00 00:00:00,不會被忽略。

需要注意這樣的情況:如果一個人的年齡是 0 (對于剛出生的嬰兒,這個值是合理的),剛好是 int 字段的零值,在添加 omitempty tag 的情況下,年齡字段會被忽略。

如果想要某一個字段在任何情況下都被 json 包忽略,需要使用如下的寫法。

type Person struct {
 Name  string `json:"-"`
 Age  int64 `json:"-"`
 Birth time.Time `json:"-"`
 Children []string `json:"-"`
}

func main() {
 birth, _ := time.Parse(time.RFC3339, "1988-12-02T15:04:27+08:00")
 person := Person{
  Name: "Wang Wu",
  Age: 30,
  Birth: birth,
  Children: []string{},
 }

 jsonBytes, _ := json.Marshal(person)
 fmt.Println(string(jsonBytes)) // {}
}

可以看到,使用 json:"-" 標簽的字段都被忽略了。

補充:golang string轉json的一些坑

先看一段代碼,起作用是把字符串轉換為結構體對應的json

type people struct {

 name string `json:"name"`

 age int `json:"age"`

 id int `json:"id"`

}

 

type student struct {

 people

 id int `json:"sid"`

}

 

func main() {

 msg := "{\"name\":\"zhangsan\", \"age\":18, \"id\":122463, \"sid\":122464}"

 var someOne student

 if err := json.Unmarshal([]byte(msg), someOne); err == nil {

  fmt.Println(someOne)

  fmt.Println(someOne.people)

 } else {

  fmt.Println(err)

 }

}

仔細看看,有沒有錯?我只能說,這樣是輸出不出來答案的,賦值錯誤,看下面的運行結果:

傷腦筋啊,我仔細看了半天,發現在定義的people和student兩個結構體下邊有綠色的波浪線(我用的vscode),像下邊這樣:

鼠標放上去顯示的是:

大家都知道,golang中變量聲明成大寫和小寫能引用的范圍是不一樣的,那我就想了,大小寫問題???一臉懵逼把變量名首字母改成了大寫,然后...就行了,代碼變成了下邊這樣:

type people struct {

 Name string `json:"name"`

 Age int `json:"age"`

 ID int `json:"id"`

}

 

type student struct {

 people

 ID int `json:"sid"`

}

 

func main() {

 msg := "{\"name\":\"zhangsan\", \"age\":18, \"id\":122463, \"sid\":122464}"

 var someOne student

 if err := json.Unmarshal([]byte(msg), someOne); err == nil {

  fmt.Println(someOne)

  fmt.Println(someOne.people)

 } else {

  fmt.Println(err)

 }

} 

輸出的結果這樣:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Python中shapefile轉換geojson的示例
  • Python中xml和json格式相互轉換操作示例
  • spring boot @ResponseBody轉換JSON 時 Date 類型處理方法【兩種方法】
  • php 將json格式數據轉換成數組的方法
  • php將從數據庫中獲得的數據轉換成json格式并輸出的方法
  • Python基于pandas實現json格式轉換成dataframe的方法
  • JS對象與json字符串相互轉換實現方法示例
  • jQuery實現form表單序列化轉換為json對象功能示例
  • python 對象和json互相轉換方法
  • Json轉換工具類

標簽:保定 曲靖 吐魯番 常州 許昌 德宏 東營 貴州

巨人網絡通訊聲明:本文標題《go json轉換實踐中遇到的坑》,本文關鍵詞  json,轉換,實踐中,遇到,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《go json轉換實踐中遇到的坑》相關的同類信息!
  • 本頁收集關于go json轉換實踐中遇到的坑的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    伊人一区二区三区| 欧美成人video| 99vv1com这只有精品| 国产成人综合亚洲网站| 国内精品国产三级国产a久久 | 亚洲一区二区视频在线观看| 中文字幕一区二区三区精华液| 亚洲精品亚洲人成人网 | 午夜精品免费在线观看| 亚洲chinese男男1069| 亚洲高清三级视频| 日韩精品视频网| 精品一区二区在线免费观看| 国产美女视频91| 99精品热视频| 欧美日韩色一区| 精品欧美一区二区在线观看| 久久久综合精品| 中文字幕制服丝袜一区二区三区| 亚洲黄色小视频| 日韩成人免费在线| 高清beeg欧美| 欧美性欧美巨大黑白大战| 日韩欧美在线观看一区二区三区| 久久精品夜色噜噜亚洲a∨| 国产精品毛片大码女人| 午夜精品福利在线| 国产精品一级二级三级| 91免费在线播放| 6080日韩午夜伦伦午夜伦| 国产欧美一区二区精品性色| 一区av在线播放| 国产真实乱偷精品视频免| 91色|porny| 精品久久五月天| 亚洲综合视频在线观看| 国产麻豆精品视频| 欧美高清视频在线高清观看mv色露露十八 | 欧美日韩国产小视频| 久久婷婷久久一区二区三区| 亚洲精品中文在线| 国产乱国产乱300精品| 成人黄页在线观看| 日韩女优电影在线观看| 一区二区三区高清| 国产激情精品久久久第一区二区| 欧美喷潮久久久xxxxx| 亚洲欧洲综合另类在线| 久久99深爱久久99精品| 欧美日韩在线精品一区二区三区激情 | 欧洲精品一区二区| 国产欧美一区视频| 美女任你摸久久| 欧美丝袜丝交足nylons图片| 中文字幕国产精品一区二区| 六月丁香综合在线视频| 欧美午夜精品一区二区三区| 亚洲日本在线a| 不卡的电影网站| 国产精品免费丝袜| 国产精品资源在线| 久久久久久久久久久久久女国产乱| 偷窥少妇高潮呻吟av久久免费| 日本道免费精品一区二区三区| 国产精品女人毛片| 本田岬高潮一区二区三区| 国产欧美精品一区二区三区四区 | 综合电影一区二区三区 | 欧美日韩精品免费| 亚洲免费三区一区二区| 99麻豆久久久国产精品免费| 国产精品福利影院| 99精品视频一区| 亚洲欧美日韩中文字幕一区二区三区 | 6080yy午夜一二三区久久| 亚洲一区二区三区爽爽爽爽爽| 91老师片黄在线观看| 中文字幕亚洲一区二区av在线 | 美国十次综合导航| 69成人精品免费视频| 蜜臀久久99精品久久久久久9| 欧美tickling挠脚心丨vk| 久草精品在线观看| 欧美国产精品v| 不卡av免费在线观看| 国产精品系列在线| 色又黄又爽网站www久久| 亚洲一区免费在线观看| 91精品国产一区二区| 国产高清一区日本| 亚洲色图在线播放| 欧美剧在线免费观看网站 | 精品处破学生在线二十三| 国产一区91精品张津瑜| 中文字幕一区二区三| 91麻豆国产自产在线观看| 亚洲国产一二三| 久久久国产午夜精品| 9色porny自拍视频一区二区| 亚洲最大色网站| 欧美刺激午夜性久久久久久久| 乱中年女人伦av一区二区| 欧美激情艳妇裸体舞| 欧美色区777第一页| 国产一区二区三区免费| 一二三区精品视频| 久久久不卡网国产精品一区| 99热精品国产| 久久99久久99| 亚洲精品写真福利| 2019国产精品| 欧美日韩午夜在线视频| 国产成a人亚洲| 日本不卡不码高清免费观看| 国产精品国产三级国产普通话三级| 欧美日韩国产成人在线91| 东方aⅴ免费观看久久av| 日韩精品电影在线| 亚洲欧美偷拍卡通变态| 久久久一区二区三区捆绑**| 欧美日韩成人在线| 白白色 亚洲乱淫| 久久成人久久爱| 婷婷综合另类小说色区| 亚洲伦理在线免费看| 中文字幕欧美区| 日韩欧美在线网站| 3atv在线一区二区三区| 91在线视频网址| av在线不卡免费看| 国产精品123区| 激情文学综合网| 久久99久久精品| 午夜成人在线视频| 国产成人丝袜美腿| 麻豆国产91在线播放| 亚洲成人激情综合网| 亚洲精品中文在线观看| 国产精品精品国产色婷婷| 欧美韩日一区二区三区四区| 久久综合资源网| 久久久综合精品| 久久综合九色综合97婷婷| 欧美mv日韩mv国产网站| 91精品欧美久久久久久动漫 | 蜜桃av一区二区三区| 日韩av二区在线播放| 五月天一区二区| 日本特黄久久久高潮| 日日夜夜精品视频免费 | 久久综合九色综合欧美就去吻| 在线综合亚洲欧美在线视频| 欧美人伦禁忌dvd放荡欲情| 欧美三级日韩在线| 6080国产精品一区二区| 欧美成人精品二区三区99精品| 欧美岛国在线观看| 国产欧美日韩在线| 亚洲精品美国一| 偷窥少妇高潮呻吟av久久免费| 七七婷婷婷婷精品国产| 国产一区亚洲一区| 99精品久久99久久久久| 欧美三级乱人伦电影| 日韩三级精品电影久久久| 精品捆绑美女sm三区| 国产精品情趣视频| 亚洲自拍偷拍九九九| 免费高清不卡av| 成人深夜福利app| 欧美性一二三区| 精品欧美一区二区在线观看| 中文字幕av在线一区二区三区| 亚洲男人的天堂一区二区| 爽好久久久欧美精品| 麻豆精品一区二区av白丝在线| 国产大陆精品国产| 日本久久一区二区| 久久先锋影音av鲁色资源网| 国产精品女主播av| 免费不卡在线视频| 成人免费高清在线| 欧美日韩国产免费一区二区 | 欧美一区二区三级| 中文字幕久久午夜不卡| 日日夜夜免费精品| 成人午夜视频网站| 欧美一卡二卡三卡四卡| 国产精品美女一区二区三区| 日一区二区三区| 成人avav影音| 欧美xxxx老人做受| 亚洲国产一区二区三区| 成人高清免费观看| 欧美精品一区二区三| 亚洲另类中文字| 粉嫩绯色av一区二区在线观看| 91精品国产入口| 亚洲国产另类精品专区| av成人老司机|