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 相关文章推荐
Go缓冲channel和非缓冲channel的区别说明
Apr 25 Golang
golang json数组拼接的实例
Apr 28 Golang
golang 在windows中设置环境变量的操作
Apr 29 Golang
golang日志包logger的用法详解
May 05 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
golang使用map实现去除重复数组
Apr 14 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 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
PHP实现定时生成HTML网站首页实例代码
2008/11/20 PHP
用javascript编写的第一人称射击游戏
2007/02/25 Javascript
使用jQuery轻松实现Ajax的实例代码
2010/08/16 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
jquery表单验证需要做些什么
2015/11/17 Javascript
对象题目的一个坑 理解Javascript对象
2015/12/22 Javascript
jQuery Mobile操作HTML5的常用函数总结
2016/05/17 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
vue router带参数页面刷新或回退参数消失的解决方法
2019/02/27 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
[43:24]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS Liquid
2018/03/30 DOTA
python获取本机外网ip的方法
2015/04/15 Python
python实现在windows服务中新建进程的方法
2015/06/30 Python
Python实现将json文件中向量写入Excel的方法
2018/03/26 Python
Win10下Python3.7.3安装教程图解
2019/07/08 Python
python GUI库图形界面开发之PyQt5计数器控件QSpinBox详细使用方法与实例
2020/02/28 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
Python提取视频中图片的示例(按帧、按秒)
2020/10/22 Python
Python+OpenCV图像处理——实现直线检测
2020/10/23 Python
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
介绍Ibatis的核心类
2013/11/18 面试题
班组长的岗位职责
2013/12/09 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
2014年教研组工作总结
2014/11/26 职场文书
如何写观后感
2015/06/19 职场文书
Docker下安装Oracle19c
2022/04/13 Servers
PostgreSQL常用字符串分割函数整理汇总
2022/07/07 PostgreSQL