go语言中json数据的读取和写出操作


Posted in Golang onApril 28, 2021

go自带json库,在使用时需要通过 import "encoding/json"来导入该库。

在读取和写入json数据之前需要定义相关的结构体来对应被操作的json数据的格式,并且结构体中需要导出或导入的变量首字母大写。

其中,json.Marshal()用于将一个对象转换为json格式的字节数组,json.Unmarshal()用于将json格式的字节数组转换为一个对象。

具体使用示例如下所示:

首先,定义结构体:

type Com struct {                                                                                                                                                          
        Name string
        Nodes []string
}

读取操作(从文件中读取json数组到结构体数组中):

func load(fname string) {
        var cs []Com = make([]Com, 0)
        fp, err := os.Open(fname)
        if err != nil {
                panic(err)
        }      
        defer fp.Close()
        bytes, err := ioutil.ReadAll(fp)
        if err != nil {
                panic(err)
        }      
        err = json.Unmarshal(bytes, &cs)
        if err != nil {
                panic(err)
        }
        //使用cs
        ...       
}

写出操作(将结构体数组转换为json数组并写入文件):

func dump(fname string) {
        fp, err := os.Create(fname)
        if err != nil {
                panic(err)
        }  
        defer fp.Close()
        cs := []Com{}
        cs = append(cs, Com{"1", []string{"1.1", "2.2"}})
        cs = append(cs, Com{"2", []string{"2.2", "3.2"}})
        cs = append(cs, Com{"3", []string{"3.4", "4.5"}})
        data, err := json.Marshal(cs)
        if err != nil {
                panic(err)
        }  
        n, err := fp.Write(data)
        if err != nil {
                panic(err)
        }  
}

补充:go 读取 json 配置文件

引言

go 读取 json 配置文件,主要有两个知识点:一是文件的读取,二是 json 数据的处理。

序列化与反序列化

对 json 数据的处理往往指的是数据的序列化和反序列化。

把变量从内存中变成可存储或传输的过程称之为序列化,序列化之后,就可以把序列化后的内容写入到磁盘,或者通过网络传输到别的机器上。反过来,把变量内容从序列化的对象重新读到内存里称之为反序列化。

go 有内置对 json 数据的处理包 “encoding/json”。

序列化为 json 格式:

data, err := json.Marshal(infos)

反序列化 json 数据:

err := json.Unmarshal(str, &info)

文件读取

配置文件的读取

config.json

{
  "userName":"root",
  "password":"",
  "host":"localhost",
  "port":"3306",
  "dbName": "test",
  "tableName":"table"
}

config.go

package main
import (
 "encoding/json"
 "fmt"
 "sync"
 io "io/ioutil"
)
//定义配置文件解析后的结构
type UserInfo struct {
 UserName  string `json:userName`
 Password  string `json:password`
 Host      string `json:host`
 Port     string `json:port`
 DbName    string `json:dbName`
 TableName string `json:tableName`
}
var UserIn UserInfo
var file_locker sync.Mutex //config file locker
func InitConfig() bool {
 conf, bl := LoadConfig("./config.json") //get config struct
 if !bl {
  fmt.Println("InitConfig failed")
  return false
 }
 UserIn = conf
 return true
}
/*************************************************
Function: LoadConfig
Description: read config file to config struct
@parameter filename: config file
Return: Config,bool
*************************************************/
func LoadConfig(filename string) (UserInfo, bool) {
 var conf UserInfo
 file_locker.Lock()
 data, err := io.ReadFile(filename) //read config file
 file_locker.Unlock()
 if err != nil {
  fmt.Println("read json file error")
  return conf, false
 }
 datajson := []byte(data)
 err = json.Unmarshal(datajson, &conf)
 if err != nil {
  fmt.Println("unmarshal json file error")
  return conf, false
 }
 return conf, true
}
func main() {
 bl := InitConfig()
 if !bl {
  fmt.Println("init config failed")
  return
 }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
golang 如何通过反射创建新对象
Apr 28 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
Golang二维数组的使用方式
May 28 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
golang生成并解析JSON
Apr 14 Golang
golang语言指针操作
Apr 14 Golang
Golang 遍历二叉树
Apr 19 Golang
Golang并发工具Singleflight
May 06 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Go gorilla securecookie库的安装使用详解
Aug 14 Golang
golang 实现菜单树的生成方式
Apr 28 #Golang
golang通过递归遍历生成树状结构的操作
Apr 28 #Golang
goland 恢复已更改文件的操作
goland 清除所有的默认设置操作
go 原生http web 服务跨域restful api的写法介绍
Apr 27 #Golang
解决Golang中ResponseWriter的一个坑
Apr 27 #Golang
golang在GRPC中设置client的超时时间
You might like
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
兼容IE和FF的图片上传前预览js代码
2013/05/28 Javascript
JavaScript中的连字符详解
2013/11/28 Javascript
JavaScript sub方法入门实例(把字符串显示为下标)
2014/10/17 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
JavaScript中清空数组的方法总结
2016/12/02 Javascript
微信小程序 UI布局常用技巧整理总结
2016/12/05 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
IScroll那些事_当内容不足时下拉刷新的解决方法
2017/07/18 Javascript
JS原生带小白点轮播图实例讲解
2017/07/22 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
详解使用angular的HttpClient搭配rxjs
2017/09/01 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
2018/09/03 Javascript
vue-cli3.0 环境变量与模式配置方法
2018/11/08 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
微信小程序wxs实现吸顶效果
2020/01/08 Javascript
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
python通过函数属性实现全局变量的方法
2015/05/16 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
python使用turtle库绘制树
2018/06/25 Python
Python时间和字符串转换操作实例分析
2019/03/16 Python
Python学习笔记之列表推导式实例分析
2019/08/13 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
EJB包括(SessionBean,EntityBean)说出他们的生命周期,及如何管理事务的
2015/07/24 面试题
护理专业求职信
2014/06/15 职场文书
2014购房个人委托书范本
2014/10/12 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis