溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Golang中使用JSON

發布時間:2021-05-11 15:31:07 來源:億速云 閱讀:198 作者:Leah 欄目:編程語言

如何在Golang中使用JSON?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

golang的優點

golang是一種編譯語言,可以將代碼編譯為機器代碼,編譯后的二進制文件可以直接部署到目標機器而無需額外的依賴,所以golang的性能優于其他的解釋性語言,且可以在golang中使用goroutine來實現并發性,它提供了一個非常優雅的goroutine調度程序系統,可以很容易地生成數百萬個goroutine。

痛點

json 是當前最常用的數據傳輸格式之一,純文本,容易使用,方便閱讀,在通信過程中大量被使用。 

你是否遇到過json中某個字段填入某種類型都適合而陷入兩難境地? (例如:定義了一個port字段,你卻不知道是填入 8080 ,還是 “8080” 的尷尬局面)

你是否遇到過json反解析報錯是因為填入字段的類型不匹配導致的?例如:

json: cannot unmarshal number into Go struct field Host.port of type string

你是否有json某字段兼容2種或者多種的數據結構的需求?

你是否想讓程序更優雅,更具有適配性,而不在被這些小細節頭痛?

如果你有或者你想,獲取你可以看看這篇文章。

重現問題

我們給了用戶一個json如下:

{
 "name":"yulibaozi",
 "port":8080
}

但是,業務方卻誤填了”8080”,結果我們程序反解析報錯,導致業務失敗。

json: cannot unmarshal number into Go struct field Host.port of type string

或許你認為這是業務方的問題,但我認為我們可以更優雅的解決這個問題。

如何解決問題

我們先定義了一個結構體

type Host struct {
 Name string `json:"name"`
 Port Port `json:"port"`
}

心細的你會發現,Port既不是int也不是string類型,而是Port類型,而Port類型是:

type Type int

const (
 Int Type = iota
 String
)

type Port struct {
 Type Type
 IntVal int
 StrVal string
}

在Port結構體中,我們發現了Type類型, 而Type類型包括了int,string兩種類型。接下來就非常重要了,我們需要實現以下這兩個接口。

json.Unmarshaller interface
json.Marshaller interface

實現代碼如下:

type Port struct {
 Type Type
 IntVal int
 StrVal string
}

// 實現 json.Unmarshaller 接口
func (port *Port) UnmarshalJSON(value []byte) error {
 if value[0] == '"' {
  port.Type = String
  return json.Unmarshal(value, &port.StrVal)
 }
 port.Type = Int
 return json.Unmarshal(value, &port.IntVal)
}

// 實現 json.Marshaller 接口
func (port Port) MarshalJSON() ([]byte, error) {
 switch port.Type {
 case Int:
  return json.Marshal(port.IntVal)
 case String:
  return json.Marshal(port.StrVal)
 default:
  return []byte{}, fmt.Errorf("impossible Port.Type")
 }
}

接下來測試:

測試反解析

測試反解析int

給出json數據:

{"name":"yulibaozi","port":8090}

反解析得到的結構體數據如下:

&{Name:yulibaozi Port:{Type:0 IntVal:8090 StrVal:}}

測試反解析string:

給出json數據:

{"name":"yulibaozi","port":"8090"}

反解析得到的結構體數據如下:

&{Name:yulibaozi Port:{Type:1 IntVal:0 StrVal:8090}}

測試編碼的json

測試編碼int的結構體如下:

host := &Host{
   Name: "yulibaozi",
   Port: Port{
     Type:  Int,
     IntVal: 8080,
   },
 }

編碼后的json如下:

{"name":"yulibaozi","port":8080}

測試編碼string的結構體如下:

host := &Host{
   Name: "yulibaozi",
   Port: Port{
     Type:  String,
     StrVal: "8080",
   },
 }

編碼后的json數據如下:

{"name":"yulibaozi","port":"8080"}

在反編碼測試中,你會發現當json填入的類型不同時,會編碼到結構體中對應的字段中。

在編碼測試中, 具體編碼那個數據是由Type來確定的。

看完上述內容,你們掌握如何在Golang中使用JSON的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女