Go语学习笔记 - Json解析 | 从零开始Go语言

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Go语学习笔记 - Json解析 | 从零开始Go语言

学习笔记,写到哪是哪。


在日常项目中,使用Json格式进行数据封装是比较常见的操作,看一下golang怎么实现。


1、json序列化

将json字符串转为go语言结构体对象。
package main
import (
  "encoding/json"
  "errors"
  "fmt"
)
var parseJsonError = errors.New("json parse error")
var toJsonError = errors.New("to json error")
type CustomJson struct {
  Name string
  Age  int
}
//序列化为json
func toJson(c *CustomJson) (string, error) {
  fmt.Printf("原始结构体: %v\n", c)
  if jsonStr, err := json.Marshal(c); err != nil {
  fmt.Println("Error =", err)
  return "", parseJsonError
  } else {
  return string(jsonStr), nil
  }
}
func main() {
  w := CustomJson{Name: "李四", Age: 30}
  result, _ := toJson(&w)
  fmt.Println(result)
}

执行结果


原始结构体: &{李四 30}                

{"Name":"李四","Age":30}  


注意


1、结构体的字段首字母要大写。如果json字符串首字母都是小写怎么办?后面会说tag的使用。


2、Json反序列化为结构体对象

将json字符串反序列化为结构体对象。


样例代码如下


package main
import (
  "encoding/json"
  "errors"
  "fmt"
)
var parseJsonError = errors.New("json parse error")
var toJsonError = errors.New("to json error")
type CustomJson struct {
  Name string
  Age  int
}
//反序列化为结构体对象
func parseJson(a string) (CustomJson, error) {
  fmt.Printf("原始字符串: %s\n", a)
  var c CustomJson
  if err := json.Unmarshal([]byte(a), &c); err != nil {
  fmt.Println("Error =", err)
  return c, parseJsonError
  }
  return c, nil
}
func main() {
  j := `{"Name": "张三", "Age": 19}`
  if p, e := parseJson(j); e == nil {
  fmt.Printf("转换对象为: %v\n", p)
  }
}

执行结果


原始字符串: {"Name": "张三", "Age": 19}

转换对象为: {张三 19}  



3、Json反序列化为map类型

将json字符串反序列化为map类型


样例代码如下


package main
import (
  "encoding/json"
  "errors"
  "fmt"
)
var parseJsonError = errors.New("json parse error")
var toJsonError = errors.New("to json error")
type CustomJson struct {
  Name string
  Age  int
}
//反序列化为map
func parseMap(a string) (map[string]interface{}, error) {
  fmt.Printf("原始字符串: %s\n", a)
  var m map[string]interface{}
  if err := json.Unmarshal([]byte(a), &m); err != nil {
  fmt.Println("Error =", err)
  return m, parseJsonError
  }
  for k, v := range m {
  fmt.Printf("k=%s,v类型为%T,v=%v\n", k, v, v)
  }
  return m, nil
}
func main() {
  j := `{"Name": "张三", "Age": 19}`
  if m, e := parseMap(j); e == nil {
  fmt.Printf("转换map为: %v\n", m)
  }
}

执行结果


原始字符串: {"Name": "张三", "Age": 19}

k=Name,v类型为string,v=张三            

k=Age,v类型为float64,v=19              

转换map为: map[Age:19 Name:张三]


注意


1、虽然是int类型的,但是反序列化的时候如果不做转换,会默认为float64。


4、Tag的使用

如果得到的json字符串每个key的首字母都是小写的,怎么转换为go的结构体对象呢?可以使用tag方式。


样例代码如下


package main
import (
  "encoding/json"
  "fmt"
)
type TestJson struct {
  Name string `json:"name"`
  Age  int    `json:"age"`
}
func main() {
  j := `{"name": "张三", "age": 19}`
  var c TestJson
  if err := json.Unmarshal([]byte(j), &c); err != nil {
  fmt.Println("Error =", err)
  }
  fmt.Println(">>>>", c)
}

执行结果


>>>> {张三 19}


注意


1、将原字符串的key作为tag打给结构体的字段,就可以实现字段转换了。



目录
打赏
0
0
0
0
9
分享
相关文章
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
【LeetCode 热题100】208:实现 Trie (前缀树)(详细解析)(Go语言版)
本文详细解析了力扣热题 208——实现 Trie(前缀树)。Trie 是一种高效的树形数据结构,用于存储和检索字符串集合。文章通过插入、查找和前缀匹配三个核心操作,结合 Go 语言实现代码,清晰展示了 Trie 的工作原理。时间复杂度为 O(m),空间复杂度也为 O(m),其中 m 为字符串长度。此外,还探讨了 Trie 的变种及应用场景,如自动补全和词典查找等。适合初学者深入了解 Trie 结构及其实际用途。
27 14
高效定位 Go 应用问题:Go 可观测性功能深度解析
为进一步赋能用户在复杂场景下快速定位与解决问题,我们结合近期发布的一系列全新功能,精心梳理了一套从接入到问题发现、再到问题排查与精准定位的最佳实践指南。
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
38 11
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
JSON数据解析实战:从嵌套结构到结构化表格
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
36 3
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
阿里双十一背后的Go语言实践:百万QPS网关的设计与实现
解析阿里核心网关如何利用Go协程池、RingBuffer、零拷贝技术支撑亿级流量。 重点分享: ① 如何用gRPC拦截器实现熔断限流; ② Sync.Map在高并发读写中的取舍。
基于 Go 语言的公司内网管理软件哈希表算法深度解析与研究
在数字化办公中,公司内网管理软件通过哈希表算法保障信息安全与高效管理。哈希表基于键值对存储和查找,如用户登录验证、设备信息管理和文件权限控制等场景,Go语言实现的哈希表能快速验证用户信息,提升管理效率,确保网络稳定运行。
30 0

推荐镜像

更多