当前位置: 代码网 > it编程>前端脚本>Golang > go语言中json处理方式详解

go语言中json处理方式详解

2024年06月13日 Golang 我要评论
json 序列化go语言中序列化json数据使用json.marshal方法,代码如下:func main() { mm := map[string]interface{}{ "name":

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处理方式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com