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语言中break label与goto label的区别
Apr 28 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
浅谈Golang 切片(slice)扩容机制的原理
Jun 09 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go并发4种方法简明讲解
Apr 06 Golang
Golang 字符串的常见操作
Apr 19 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang 实现WebSockets
Apr 24 Golang
Golang 入门 之url 包
May 04 Golang
Go web入门Go pongo2模板引擎
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
2020最新CPU的性能排名
2020/04/02 数码科技
PHP 递归效率分析
2009/11/24 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
jquery实现百叶窗效果
2017/01/12 Javascript
jQuery实现优雅的弹窗效果(6)
2017/02/08 Javascript
Bootstrap入门教程一Hello Bootstrap初识
2017/03/02 Javascript
layui弹出层效果实现代码
2017/05/19 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
2017/09/25 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
Vue常用的几个指令附完整案例
2018/11/06 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
微信小程序 scroll-view 水平滚动实现过程解析
2019/10/12 Javascript
js判断在哪个浏览器打开项目的方法
2020/01/21 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
[46:16]2018DOTA2亚洲邀请赛3月30日 小组赛B组 iG VS VP
2018/03/31 DOTA
天翼开放平台免费短信验证码接口使用实例
2013/12/18 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
python opencv 简单阈值算法的实现
2019/08/04 Python
python生成大写32位uuid代码
2020/03/03 Python
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
Smallable意大利家庭概念店:设计师童装及家居装饰
2018/01/08 全球购物
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
建筑系毕业生自我鉴定
2014/01/24 职场文书
给老婆的保证书范文
2014/04/28 职场文书
会议通知范文
2015/04/15 职场文书
心得体会该怎么写呢?
2019/06/27 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python