Golang解析JSON对象


Posted in Golang onApril 30, 2022

在日常项目中,使用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}   

注意

结构体的字段首字母要大写。如果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:张三] 

注意

虽然是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} 

注意

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


Tags in this post...

Golang 相关文章推荐
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
Golang 如何实现函数的任意类型传参
Apr 29 Golang
Golang中异常处理机制详解
Jun 08 Golang
Go遍历struct,map,slice的实现
Jun 13 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
Go语言并发编程 sync.Once
Oct 16 Golang
Golang数据类型和相互转换
Apr 12 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang 对es的操作实例
Apr 20 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
GO中sync包自由控制并发示例详解
Aug 05 Golang
Golang 并发编程 SingleFlight模式
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 #Golang
Golang 实现WebSockets
Golang ort 中的sortInts 方法
Apr 24 #Golang
Golang 切片(Slice)实现增删改查
Apr 22 #Golang
Golang 结构体数据集合
Apr 22 #Golang
Golang map映射的用法
Apr 22 #Golang
You might like
收音机另类DIY - 纸巾盒做外壳
2021/03/02 无线电
apache和php之间协同工作的配置经验分享
2013/04/08 PHP
php单例模式实现方法分析
2015/03/14 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
Div Select挡住的解决办法
2008/08/07 Javascript
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
自己动手写的javascript前端等待控件
2015/10/30 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
运用jQuery写的验证表单(实例讲解)
2017/07/06 jQuery
vue复合组件实现注册表单功能
2017/11/06 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
python多进程控制学习小结
2018/10/31 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
html5适合移动应用开发的12大特性
2014/03/19 HTML / CSS
h5使用canvas画布实现手势解锁
2019/01/04 HTML / CSS
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
购买一个高级域名:BuyDomains
2018/03/11 全球购物
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
2014年工商所工作总结
2014/12/09 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
《蜜蜂引路》教学反思
2016/02/22 职场文书
七年级作文之环保作文
2019/10/17 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
MySQL Router实现MySQL的读写分离的方法
2021/05/27 MySQL
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python