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 interface{}==nil 的几种坑及原理分析
Apr 24 Golang
golang中的空slice案例
Apr 27 Golang
golang在GRPC中设置client的超时时间
Apr 27 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
Golang 编译成DLL文件的操作
May 06 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
Golang二维数组的使用方式
May 28 Golang
Go 语言下基于Redis分布式锁的实现方式
Jun 28 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
victoriaMetrics库布隆过滤器初始化及使用详解
Apr 05 Golang
Go获取两个时区的时间差
Apr 20 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函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
PHP实现递归目录的5种方法
2016/10/27 PHP
javascript编程起步(第七课)
2007/02/27 Javascript
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
JavaScript获取当前运行脚本文件所在目录的方法
2016/02/03 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
2016/05/18 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
jQuery实现右侧抽屉式在线客服功能
2017/12/25 jQuery
使用npm安装最新版本nodejs
2018/01/18 NodeJs
JavaScript函数式编程(Functional Programming)箭头函数(Arrow functions)用法分析
2019/05/22 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
vue 实现用户登录方式的切换功能
2020/04/14 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
在Python中使用matplotlib模块绘制数据图的示例
2015/05/04 Python
python实现批量注册网站用户的示例
2019/02/22 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
机房搬迁方案
2014/05/01 职场文书
产品设计开发计划书
2014/05/07 职场文书
员工合理化建议书
2014/05/19 职场文书
任命书怎么写
2014/06/04 职场文书
爱国主题班会教案
2015/08/14 职场文书
2016年全国助残日活动总结
2016/04/01 职场文书
Java网络编程之UDP实现原理解析
2021/09/04 Java/Android
Python 实现Mac 屏幕截图详解
2021/10/05 Python
Kubernetes控制节点的部署
2022/04/01 Servers