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 相关文章推荐
win10下go mod配置方式
Apr 25 Golang
golang中的空slice案例
Apr 27 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
golang elasticsearch Client的使用详解
May 05 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
Go 自定义package包设置与导入操作
May 06 Golang
解决golang 关于全局变量的坑
May 06 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
Go 语言结构实例分析
Jul 04 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Golang 并发编程 SingleFlight模式
Apr 26 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
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
javascript实现的动态添加表单元素input,button等(appendChild)
2007/11/24 Javascript
点图片上一页下一页翻页效果
2008/07/09 Javascript
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
jquery 1.4.2发布!主要是性能与API
2010/02/25 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
nodejs模块学习之connect解析
2017/07/05 NodeJs
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
uniapp微信小程序实现一个页面多个倒计时
2020/11/01 Javascript
vue常用高阶函数及综合实例
2021/02/25 Vue.js
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
python中stdout输出不缓存的设置方法
2014/05/29 Python
Python 描述符(Descriptor)入门
2016/11/20 Python
Python实现的计算器功能示例
2018/04/26 Python
Python高级用法总结
2018/05/26 Python
Python 利用邮件系统完成远程控制电脑的实现(关机、重启等)
2019/11/19 Python
如何在VSCode下使用Jupyter的教程详解
2020/07/13 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
html5使用Canvas绘图的使用方法
2017/11/21 HTML / CSS
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
Tomcat Mysql datasource数据源配置
2015/12/28 面试题
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
资源工程专业毕业生求职信
2014/02/27 职场文书
难忘的一天教学反思
2014/04/30 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
实习协议书范本
2014/09/25 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
金融专业银行实习证明模板
2014/11/28 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书