首頁 >系統教程 >Linux >json資料的序列化與反序列化

json資料的序列化與反序列化

王林
王林轉載
2024-01-09 11:30:174321瀏覽
導讀 json的全名是Javascript object notation, 中文全名:js物件表示法。在序列化和反序列化的協議中,有:json、xml、yaml、protocol buffer等。其中json是前後端API契約資料的主要傳輸形式。 json支援數值、布林值、陣列和物件四種資料類型。透過這四種資料類型,可以建立複雜的資料模型。

在Go語言中,我們可以使用json標準函式庫來實現資料的序列化和反序列化。這個函式庫提供了方便的方法來序列化和反序列化map、結構體、陣列、切片和內建的基本資料類型。透過使用json標準函式庫,我們可以輕鬆地將資料轉換為json格式,並在需要時將其解析回原始資料類型。這為我們處理數據提供了很大的便利性。

在這裡,我將舉出三個例子來說明json的使用方法。對於初學者來說,可能經常只使用一種結構體物件來接收和發送資料。下面我們就來看看具體的例子。 1. 使用結構體物件接收資料: ``` type Person struct { Name string `json:"name"` Age int `json:"age"` } func main() { data := `{"name": "Alice", "age": 25}` var p Person err := json.Unmarshal([]byte(data), &p) if err != nil { fmt.Println("解析json失敗:", err) return

json資料的序列化與反序列化

#結構體

type Person struct {<br> Name string `json:"name"`<br># Age int `json:"age"`<br># }
<br> func main() {<br> var (<br> newPer Person<br> bts []byte<br> )<br> per:=Person{<br> Name: "Lily",<br> Age: 29,<br> }<br> // 序列化<br> if bts, err = json.Marshal(per); err !=nil{<br> log.Fatal(err.Error())<br> return<br> }
<br> if err = json.Unmarshal(bts, &newPer); err !=nil{<br># log.Fatal(err.Error())<br> return<br> }<br> fmt.Println(newPer)<br> }

map

func main() {<br> var (<br> smap = map[string]int{<br># "Age": 28,<br> "Sex": 1,<br> "Floor": 12,<br> }<br> newSmap = make(map[string]int)<br> bts []byte<br> )<br> if bts, err = json.Marshal(smap); err !=nil {<br> log.Fatal(err.Error())<br> return<br> }<br> if err = json.Umarshal(bts, &newSmap); err !=nil {<br> log.Fatal(err.Error())<br> return<br> }<br> fmt.Println(newSmap)<br> }

陣列或slice動態陣列

func main() {<br> var (<br> ages []int = []int{23, 20, 28, 25, 30}<br> bts []byte<br> err error<br> newAges = make([]int, len(ages))<br> )<br> if bts, err = json.Marshal(ages); err != nil {<br> fmt.Println(err.Error())<br> return<br> }<br> if err = json.Unmarshal(bts, &newAges); err != nil {<br> fmt.Println(err.Error())<br> return<br> }<br> fmt.Println("new ages: ", newAges)<br> return<br> }
初學者對結構體的json序列化和反序列化比較清楚,對後兩種可能很少用,也不會用。

  • 對於數組類型數據,但是有些業務場景前端會使用。
  • 對於map類型,一般會在Go語言的服務端呼叫第三方REST介面時,服務端只想要指定的回傳碼,判斷是否呼叫成功時。程式猿不想寫整體的struct結構體定義,也可能是比較懶,然後用了一個map[string]interface{}去接收回傳資料。這時候透過json標準函式庫中的Unmarshal反序列化後,然後透過map["err_code"].(int)取得回傳碼,然後再做其他後續處理邏輯。

這裡還要說明一個結構體時,有時候我會用到的特性,結構體的json支援的標籤值特性omitempty,例如:
type Person struct {<br> Name string `json:"name,omitempty"`<br> Age int `json:"age"`<br># }<br> 它表示,當函數omitempty的標籤值時,它所對應的結構體的資料元素值如果是零值,則它不會輸出。那就是說如果服務端回傳的結構體資料中的某個元素為空時,不回傳給前端這個元素,就可以使用omitempty的json標籤值屬性。

在這裡提供大家一個滴滴公司的一位高級工程師taowen寫的json解析庫,世界上最快的。 github位址:jsoniter。

文章轉載自 開源中國社群 [http://www.oschina.net]

以上是json資料的序列化與反序列化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:linuxprobe.com。如有侵權,請聯絡admin@php.cn刪除