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语言带缓冲的通道实现
Apr 26 Golang
golang 实现两个结构体复制字段
Apr 28 Golang
彻底理解golang中什么是nil
Apr 29 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
关于golang高并发的实现与注意事项说明
May 08 Golang
Go语言实现Snowflake雪花算法
Jun 08 Golang
Go中的条件语句Switch示例详解
Aug 23 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
golang生成并解析JSON
Apr 14 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang bufio详细讲解
Apr 21 Golang
Go结合Gin导出Mysql数据到Excel表格
Aug 05 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
使用sockets:从新闻组中获取文章(三)
2006/10/09 PHP
关于php连接mssql:pdo odbc sql server
2011/07/20 PHP
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
很可爱的输入框
2008/08/03 Javascript
使用JavaScript库还是自己写代码?
2010/01/28 Javascript
Array的push与unshift方法性能比较分析
2011/03/05 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
JavaScript中关于iframe滚动条的去除和保留
2016/11/17 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
Webpack devServer中的 proxy 实现跨域的解决
2018/06/15 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
利用jsonp解决js读取本地json跨域的问题
2018/12/11 Javascript
JavaScript中concat复制数组方法浅析
2019/01/20 Javascript
layer.confirm()右边按钮实现href的例子
2019/09/27 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
python实现从字典中删除元素的方法
2015/05/04 Python
基于python元祖与字典与集合的粗浅认识
2017/08/23 Python
Python对数据进行插值和下采样的方法
2018/07/03 Python
使用 python pyautogui实现鼠标键盘控制功能
2019/08/04 Python
python numpy生成等差数列、等比数列的实例
2020/02/25 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
Python json读写方式和字典相互转化
2020/04/18 Python
python 线程的五个状态
2020/09/22 Python
世界上最大的曲棍球商店:Pro Hockey Life
2017/10/30 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
工程师岗位职责
2013/11/08 职场文书
党支部公开承诺践诺书
2014/03/28 职场文书
文明单位汇报材料
2014/12/24 职场文书
瘦西湖导游词
2015/02/03 职场文书
分析Python list操作为什么会错误
2021/11/17 Python
MySQL 字符集 character
2022/05/04 MySQL