测试小站: 处理网 回收帮 培训网 富贵论坛 老富贵论坛

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"}

posted @ 2021-12-21 14:09  linjingyg  阅读(315)  评论(0)    收藏  举报