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 高并发问题的解决方案
May 08 Golang
golang中的并发和并行
May 08 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
Golang数据类型和相互转换
Apr 12 Golang
Go语言grpc和protobuf
Apr 13 Golang
Golang日志包的使用
Apr 20 Golang
Golang 实现WebSockets
Apr 24 Golang
详解Go语言中Get/Post请求测试
Jun 01 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
GoFrame基于性能测试得知grpool使用场景
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实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
理解php原理的opcodes(操作码)
2010/10/26 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
微信分享的标题、缩略图、连接及描述设置方法
2014/10/14 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
javascript字符串对象常用api函数小结(连接,替换,分割,转换等)
2016/09/20 Javascript
vue translate peoject实现在线翻译功能【新手必看】
2018/06/07 Javascript
vue 组件的封装之基于axios的ajax请求方法
2018/08/11 Javascript
利用原生JS实现data方法示例代码
2019/05/28 Javascript
layui 点击重置按钮, select 并没有被重置的解决方法
2019/09/03 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
[03:59]第二届DOTA2亚洲邀请赛选手传记-VGJ.rOtk
2017/04/03 DOTA
python制作一个桌面便签软件
2015/08/09 Python
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
Python科学画图代码分享
2017/11/29 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
Win下PyInstaller 安装和使用教程
2019/12/25 Python
Python 爬虫性能相关总结
2020/08/03 Python
在canvas上实现元素图片镜像翻转动画效果的方法
2018/03/20 HTML / CSS
英国最大的滑板品牌选择:Route One
2019/09/22 全球购物
如何在Cookie里面保存Unicode和国际化字符
2013/05/25 面试题
Ajax和javascript的区别
2013/07/20 面试题
致标枪运动员广播稿
2014/02/06 职场文书
八项规定整改方案
2014/02/21 职场文书
本科毕业生求职自荐信
2014/04/09 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
工作所在部门证明
2014/09/21 职场文书
水浒传读书笔记
2015/06/25 职场文书
话题作文之自信作文
2019/11/15 职场文书
MySQL普通表如何转换成分区表
2022/05/30 MySQL
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技