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各时间字符串使用解析
Apr 02 Golang
Go Gin实现文件上传下载的示例代码
Apr 02 Golang
一文读懂go中semaphore(信号量)源码
Apr 03 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
试了下Golang实现try catch的方法
Jul 01 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
如何利用golang运用mysql数据库
Mar 13 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 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高效率写法(详解原因)
2013/06/20 PHP
解析php file_exists无效的解决办法
2013/06/26 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
PHP实现动态柱状图改进版
2015/03/30 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
PHP PDOStatement::getAttribute讲解
2019/02/01 PHP
Firefox div高度自适应
2009/04/28 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
javascript实现yield的方法
2013/11/06 Javascript
js跨域问题浅析及解决方法优缺点对比
2014/11/08 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
BootStrap表单验证实例代码
2017/01/13 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
微信小程序左滑删除功能开发案例详解
2018/11/12 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
使用vue中的混入mixin优化表单验证插件问题
2019/07/02 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
Python判断变量是否为Json格式的字符串示例
2017/05/03 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
Python数据相关系数矩阵和热力图轻松实现教程
2020/06/16 Python
Python 程序员必须掌握的日志记录
2020/08/17 Python
如何通过python计算圆周率PI
2020/11/11 Python
事业单位接收函
2014/01/10 职场文书
装修致歉信
2014/01/15 职场文书
婚纱店策划方案
2014/05/22 职场文书
商场促销活动总结
2014/07/10 职场文书
无罪辩护词范文
2015/05/21 职场文书
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫