1. 程式人生 > 其它 >go語言中的關於json編碼與解碼的注意點

go語言中的關於json編碼與解碼的注意點

  今天記錄一下,go語言中關於json編碼與解碼的一些注意點,寫習慣了php的編碼或解碼,再來寫go的是真麻煩,php中直接一個json_encode()和json_decode()搞定!

  ---------------------

  只要學不死!!

  就往死裡學!!

  --------------------- 狂神哥

  基本使用-編碼

  package main

  import (

  "encoding/json"

  "fmt"

  )

  // Student 定義學生結構體

  type Student struct {

  Name string

  Age int8

  Score float64

  }

  func main() {

  student :=&Student{

  Name: "tom",

  Age: 20,

  Score: 89.50,

  }

  //返回兩個值,一個byte型別的切片,一個是err

  byteInfo, err :=json.Marshal(student)

  if err !=nil {

  fmt.Println("json編碼失敗",err)

  return

  }

  fmt.Println(string(byteInfo))

  }

  //列印的值如下

  // {"Name":"tom","Age":20,"Score":89.5}

  基本使用-解碼

  package main

  import (

  "encoding/json"

  "fmt"

  )

  type Student3 struct {

  Name string `json:"name"`

  Age int8 `json:"age,string"`

  Score float64 `json:"score,omitempty"`

  }

  func main() {

  var data=`{"name":"tom","age":"20","score":0.01}` //定義一個json串

  //解碼成結構體

  s2 :=&Student3{} //這裡需要定義接收變數,

  err:=json.Unmarshal([]byte(data),s2)

  if err !=nil {

  fmt.Println("解碼失敗",err)

  return

  }

  fmt.Println(*s2)

  }

  //列印的值如下:

  {tom 20 0.01}

  tag標籤的使用

  功能一: 解決key值大小寫問題

  在生產環境中,json格式的字串一般都是小寫開頭,但go編碼出來的json字串明顯不符合,解決這個問題需要使用tag標籤,有的小夥伴,就提出了問題,直接用小寫表示不就行了嗎?說多都是淚,直接上程式碼吧,先說結論 !結論是:如果是小寫字母開頭的話,編碼時會忽略小寫欄位

  package main

  import (

  "encoding/json"

  "fmt"

  )

  // Student2 定義學生結構體

  type Student2 struct {

  name string

  age int8

  score float64

  }

  func main() {

  student :=&Student2{

  name: "tom",

  age: 20,

  score: 89.50,

  }

  //返回兩個值,一個byte型別的切片,一個是err

  byteInfo, err :=json.Marshal(student)

  if err !=nil {

  fmt.Println("json編碼失敗",err)

  return

  }

  fmt.Println(string(byteInfo))

  }

  原因如下:

  //在go中沒有像的別的語言中的public,protected private這種關鍵字來約束變數是公有還是受保護的,在go語言中是使用大小寫來區分的,只是要大寫開頭的變數,就可以在包外呼叫,小寫開頭的只能在包內使用,這也是為什麼小寫會被忽略的原因

  解決辦法:

  // Student2 定義學生結構體,只需要在改變如下就可以

  type Student2 struct {

  Name string `json:"name"`

  Age int8 `json:"age"`

  Score float64 `json:"score"`

  }

  //列印的資料如下,看到都可以變成小寫了

  //{"name":"tom","age":20,"score":89.5}

  功能二:忽略指定的欄位

  //如果在go的結構體中有些欄位是沒有必要傳輸的,可以使用-這個符號 來忽略欄位

  // Student2 定義學生結構體

  type Student2 struct {

  Name string `json:"-"` //這裡改變了

  Age int8 `json:"age"`

  Score float64 `json:"score"`

  }

  //輸入內容,則沒有name欄位了

  {"age":20,"score":89.5}

  功能三:可以序列化的時候忽略0值或空值

  type Student2 struct {

  Name string `json:"name"`

  Age int8 `json:"age"`

  Score float64 `json:"score,omitempty"`//這裡添加了omitempty標籤,如果是空值或零0值,則會忽略

  }

  student :=&Student2{

  Name: "tom",

  Age: 20,

  Score: 0, //這個給個0值

  }

  //列印 輸出如下,沒有score欄位

  {"name":"tom","age":20}

  功能四:在編碼或解碼過程中,可以通過指定string,number,boolean來改變欄位型別

  type Student2 struct {

  Name string `json:"name"`

  Age int8 `json:"age,string"` //把int8轉成string

  Score float64 `json:"score,omitempty"`

  }

  //列印輸出

  {"name":"tom","age":"20"}