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项目中使用init()
Apr 12 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
goland设置颜色和字体的操作
May 05 Golang
go语言中GOPATH GOROOT的作用和设置方式
May 05 Golang
goland 设置project gopath的操作
May 06 Golang
Golang Gob编码(gob包的使用详解)
May 07 Golang
golang中的并发和并行
May 08 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Golang解析JSON对象
Apr 30 Golang
Go语言入门exec的基本使用
May 20 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
基于Python实现西西成语接龙小助手
Aug 05 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动态函数调用方法
2015/05/21 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
2013/07/22 Javascript
ie与ff下的event事件使用介绍
2013/11/25 Javascript
JS获得选取checkbox整行数据的方法
2015/01/28 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
jQuery 判断是否包含在数组中Array[]的方法
2016/08/03 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
JS区分Object与Aarry的六种方法总结
2017/02/27 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
Vue.js进行查询操作的实例详解
2017/08/25 Javascript
JS实现常见的查找、排序、去重算法示例
2018/05/21 Javascript
浅谈js闭包理解
2019/04/01 Javascript
vue中created和mounted的区别浅析
2019/08/13 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
vue中的使用token的方法示例
2020/03/10 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
[32:47]完美世界DOTA2联赛 GXR vs IO 第二场 11.07
2020/11/09 DOTA
Python中endswith()函数的基本使用
2015/04/07 Python
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
python匿名函数的使用方法解析
2019/10/10 Python
使用python-pptx包批量修改ppt格式的实现
2020/02/14 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
英国最大的海报商店:GB Posters
2018/03/20 全球购物
校园安全检查制度
2014/02/03 职场文书
竞争上岗实施方案
2014/03/21 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
教师个人考察材料
2014/12/16 职场文书
党员廉洁自律个人总结
2015/02/13 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
Python pyecharts绘制条形图详解
2022/04/02 Python