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如何替换某个文件中的字符串
Apr 25 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
golang elasticsearch Client的使用详解
May 05 Golang
Go标准容器之Ring的使用说明
May 05 Golang
再次探讨go实现无限 buffer 的 channel方法
Jun 13 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Go 中的空白标识符下划线
Mar 25 Golang
Golang 遍历二叉树
Apr 19 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 Golang
Go语言测试库testify使用学习
Jul 23 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中,文件上传
2006/12/06 PHP
php实现的SESSION类
2014/12/02 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
浅谈PHP的反射机制
2016/12/15 PHP
PHP四种排序算法实现及效率分析【冒泡排序,插入排序,选择排序和快速排序】
2018/04/27 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
javascript function、指针及内置对象
2009/02/19 Javascript
JS input 数字验证代码
2009/07/30 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
jQuery团购倒计时特效实现方法
2015/05/07 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
AngularJs+Bootstrap实现漂亮的计算器
2017/08/10 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
python matplotlib 注释文本箭头简单代码示例
2018/01/08 Python
python绘制立方体的方法
2018/07/02 Python
Python使用pymysql从MySQL数据库中读出数据的方法
2018/07/25 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
Python脚本实现Zabbix多行日志监控过程解析
2020/08/26 Python
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
中软国际Java程序员机试题
2012/08/19 面试题
大学四年个人自我小结
2014/03/05 职场文书
红旗渠导游词
2015/02/09 职场文书
开会通知
2015/04/20 职场文书
无婚姻登记记录证明
2015/06/18 职场文书
被委托人身份证明
2015/08/07 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
赞美教师的句子
2019/09/02 职场文书
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL