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
Go语言使用select{}阻塞main函数介绍
Apr 25 Golang
golang中的空slice案例
Apr 27 Golang
golang 如何用反射reflect操作结构体
Apr 28 Golang
Go语言中break label与goto label的区别
Apr 28 Golang
Go使用协程交替打印字符
Apr 29 Golang
goland设置颜色和字体的操作
May 05 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 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笔记之:数据类型与常量的使用分析
2013/05/14 PHP
php断点续传之如何分割合并文件
2014/03/22 PHP
PHP中feof()函数实例测试
2014/08/23 PHP
中文字符串截取的js函数代码
2013/04/17 Javascript
javascript对象的使用和属性操作示例详解
2014/03/02 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
jQuery中add()方法用法实例
2015/01/08 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
JQuery 传送中文乱码问题的简单解决办法
2016/05/24 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
python查询文件夹下excel的sheet名代码实例
2019/04/02 Python
Python OpenCV实现视频分帧
2019/06/01 Python
Python类如何定义私有变量
2020/02/03 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
jupyter notebook 多环境conda kernel配置方式
2020/04/10 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
开会迟到检讨书
2014/01/08 职场文书
演讲稿开场白
2014/01/13 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
《北大荒的秋天》教学反思
2014/04/14 职场文书
竞选生活委员演讲稿
2014/04/28 职场文书
购房委托书范本
2014/09/18 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
挂靠协议书
2015/01/27 职场文书
入党积极分子个人总结
2015/03/02 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
解析高可用Redis服务架构分析与搭建方案
2021/06/20 Redis
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android