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 生成对应的数据表struct定义操作
Apr 28 Golang
golang gopm get -g -v 无法获取第三方库的解决方案
May 05 Golang
go xorm框架的使用
May 22 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
Go 语言结构实例分析
Jul 04 Golang
入门学习Go的基本语法
Jul 07 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang map映射的用法
Apr 22 Golang
Golang入门之计时器
May 04 Golang
Go语言入门exec的基本使用
May 20 Golang
Go语言测试库testify使用学习
Jul 23 Golang
Go中使用gjson来操作JSON数据的实现
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入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
php中hashtable实现示例分享
2014/02/13 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
关于Ext中form移除textfield方法:hide(),setVisible(false),remove()
2010/12/02 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
js将控件隐藏及display属性的使用介绍
2013/12/30 Javascript
js中的onchange和onpropertychange (onchange无效的解决方法)
2014/03/08 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
Javascript中arguments用法实例分析
2015/06/13 Javascript
轻松学习jQuery插件EasyUI EasyUI创建菜单与按钮
2015/11/30 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
vue的一个分页组件的示例代码
2017/12/25 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
详解React中合并单元格的正确写法
2019/01/08 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
python实现二分查找算法
2017/09/21 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
python处理自动化任务之同时批量修改word里面的内容的方法
2019/08/23 Python
Python 3.8正式发布,来尝鲜这些新特性吧
2019/10/15 Python
比驿:全球酒店比价网
2018/06/20 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
护理专业本科生自荐信
2013/10/01 职场文书
外贸业务员岗位职责
2013/11/24 职场文书
职业女性的职业规划
2014/03/04 职场文书
经销商订货会主持词
2014/03/27 职场文书
小学国旗下的演讲稿
2014/08/28 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
Windows 11上手初体验:任务栏和开始菜单等迎来大改
2021/11/21 数码科技
python解析照片拍摄时间进行图片整理
2022/07/23 Python