go语言中json处理方式详解

 更新时间:2024年05月24日 08:26:56   作者:uccs  
这篇文章主要介绍了go语言中json处理方式,文中通过实例代码讲解的非常详细,对大家的学习或工作有一定的帮助,感兴趣的小伙伴跟着小编一起来看看吧

json 序列化

go 语言中序列化 json 数据使用 json.Marshal 方法,代码如下:

func main() {
  mm := map[string]interface{}{
    "name": "uccs",
    "age":  12,
    "extra": map[string]interface{}{
      "phone": "12345678910",
    },
  }
  bytes, _ := json.Marshal(mm)
  fmt.Println(string(bytes))
}

如果说需要对 json 数据进行格式化输出,可以使用 json.MarshalIndent 方法,代码如下:

  • MarshalIndent 第一个参数是要序列化的数据,第二个参数是前缀,第三个参数是缩进字符
json.MarshalIndent(mm, "", "  ")

序列化结构体

序列化结构体的时候,需要注意以下 2 点:

  • 结构体的字段必须是大写字母开头,否则无法序列化
  • 可以使用 json tag 来指定序列化后的字段名

json tag 使用方式:

  • json:"name" 表示序列化后的字段名为 name
  • json:"Phone,omitempty" 表示序列化后的字段名为 phone,如果字段值为空,则不序列化
  • 如果是指针形式的字段
    • 字段值为空,则不序列化,例如下面的 Name 字段,不会被序列化,因为指针为 nil
    • 字段值是空字符串,则序列化,例如下面的 Email 字段,会被序列化,因为指针不为 nil
type Person struct {
  Name  *string `json:"name,omitempty"`
  Email *string `json:"email,omitempty"`
}
email := ""
p := Person{
  Email: &email,
}
  • json:"age,string" 序列化时可以将数字变成字符串
  • json:"-" 序列化时忽略该字段

反序列化

go 反序列化使用 json.Unmarshal 方法,传入 json 字符串和结构体指针,代码如下:

func main() {
  j := `{
    "name": "uccs",
    "age": 18,
    "email": "",
    "phone": "2222"
  }`
  var p Person
  _ := json.Unmarshal([]byte(j), &p)
  fmt.Println(p)
}

反序列化的时候,需要注意,传递空字符串和没有传递字段是没有区别的,都会被反序列化,例如上面的 Email 字段,传递空字符串和没有传递字段拿到的值都是一个空

如何区分传递空字符串和没有传递字段呢?

需要在定义结构体的时候使用指针类型,例如下面的 Email 字段,如果传递空字符串,则 Email 字段的值是一个地址,如果没有传递字段,则 Email 字段的值是 nil

type Person struct {
  Name  string  `json:"name"`
  Age   int     `json:"age"`
  Email *string `json:"email"`
  Phone string  `json:"phone"`
}
j := `{
  "name": "uccs",
  "age": 18,
  "phone": "2222"
}`
k := `{
  "name": "uccs",
  "age": 18,
  "email": "",
  "phone": "2222"
}`
var p1 Person
var p2 Person
_ := json.Unmarshal([]byte(j), &p1)
_ := json.Unmarshal([]byte(k), &p2)
fmt.Println(p1)  // {uccs 18 <nil> 2222}
fmt.Println(p2)  // {uccs 18 0xc000014140 2222}

所以我们可以通过判断 Email 字段是否为 nil 来区分传递空字符串和没有传递字段

fmt.Println(p1.Email == nil)  // Email 是否为 nil 判断是否传递了 Email 字段

encoder

encoder 是一个 Writer 接口,可以用于写入文件

相比于 file.WriteString(string(bytes)) 方式,encoder 可以直接将结构体写入文件,并且是以流的方式写入

func main() {
  p := Person{
    Name: "xiaoming",
    Age:  543251,
  }
  file, _ := os.Create("person.json")
  defer file.Close()
  encoder := json.NewEncoder(file)
  encoder.SetEscapeHTML(true) // 转义 json 中的特殊字符
  encoder.Encode(p)
}

decoder

decoder 是一个 Reader 接口,可以用于读取文件

decoder 是 encoder 的逆操作,可以从文件中读取 json 数据并且反序列化

func main() {
  file, _ := os.Open("person.json")
  defer file.Close()
  decoder := json.NewDecoder(file)
  p := Person{}
  decoder.Decode(&p)
  fmt.Println(p)
}

到此这篇关于go语言中json处理方式详解的文章就介绍到这了,更多相关go json处理方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用golang编写一个并发工作队列

    使用golang编写一个并发工作队列

    这篇文章主要介绍了使用golang编写一个并发工作队列的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Go语言range关键字循环时的坑

    Go语言range关键字循环时的坑

    今天小编就为大家分享一篇关于Go语言range关键字循环时的坑,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • go 压缩解压zip文件源码示例

    go 压缩解压zip文件源码示例

    这篇文章主要为大家介绍了go压缩及解压zip文件的源码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • golang快速实现网页截图的方法

    golang快速实现网页截图的方法

    这篇文章主要介绍了golang快速实现网页截图的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • gin自定义中间件解决requestBody不可重读(请求体取值)

    gin自定义中间件解决requestBody不可重读(请求体取值)

    这篇文章主要介绍了gin自定义中间件解决requestBody不可重读,确保控制器能够获取请求体值,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go使用chan或context退出协程示例详解

    Go使用chan或context退出协程示例详解

    这篇文章主要为大家介绍了Go使用chan或context退出协程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • go时间/时间戳操作大全(小结)

    go时间/时间戳操作大全(小结)

    这篇文章主要介绍了go时间/时间戳操作大全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Gin框架中的GET和POST表单处理的实现

    Gin框架中的GET和POST表单处理的实现

    Gin框架提供了简单而强大的机制来处理GET和POST表单提交的数据,通过c.Query、c.PostForm、c.Bind和c.Request.FormFile等方法,可以轻松地获取和处理各种表单数据,感兴趣的可以了解一下
    2025-03-03
  • 浅析Go语言中的超时控制

    浅析Go语言中的超时控制

    日常开发中我们大概率会遇到超时控制的场景,而一个良好的超时控制可以有效的避免一些问题,所以本文就来和大家深入探讨一下Go语言中的超时控制吧
    2023-10-10
  • Go语言实现猜数字小游戏

    Go语言实现猜数字小游戏

    这篇文章主要为大家详细介绍了Go语言实现猜数字小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10

最新评论