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语言map与string的相互转换的实现
Apr 07 Golang
golang 实现菜单树的生成方式
Apr 28 Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 Golang
Golang生成Excel文档的方法步骤
Jun 09 Golang
Go语言基础切片的创建及初始化示例详解
Nov 17 Golang
Golang 并发下的问题定位及解决方案
Mar 16 Golang
Golang 1.18 多模块Multi-Module工作区模式的新特性
Apr 11 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
GO语言异常处理分析 err接口及defer延迟
Apr 14 Golang
Golang 对es的操作实例
Apr 20 Golang
Go语言入门exec的基本使用
May 20 Golang
Go gorilla/sessions库安装使用
Aug 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使用Jpgraph创建折线图效果示例
2017/02/15 PHP
Yii框架ACF(accessController)简单权限控制操作示例
2019/04/26 PHP
PHP设计模式(三)建造者模式Builder实例详解【创建型】
2020/05/02 PHP
jquery 图片轮换效果
2010/07/29 Javascript
文本框获得焦点和失去焦点的判断代码
2012/03/18 Javascript
js 延迟加载 改变JS的位置加快网页加载速度
2012/12/11 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
fetch 使用及如何接收JS传值
2017/11/11 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
JS异步执行结果获取的3种解决方式
2019/02/19 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
Python文件操作类操作实例详解
2014/07/11 Python
Django中使用group_by的方法
2015/05/26 Python
python使用多进程的实例详解
2018/09/19 Python
对Python 两大环境管理神器 pyenv 和 virtualenv详解
2018/12/31 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
python 发送json数据操作实例分析
2019/10/15 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
python获取整个网页源码的方法
2020/08/03 Python
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
毕业生的自我鉴定该怎么写
2013/12/02 职场文书
教师队伍管理制度
2014/01/14 职场文书
高中历史教学反思
2014/02/08 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
教师考核评语大全
2014/12/31 职场文书
教师个人师德总结
2015/02/06 职场文书
师范生见习自我总结
2015/06/23 职场文书
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA