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语言带缓冲的通道实现
Apr 26 Golang
golang 接口嵌套实现复用的操作
Apr 29 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
golang elasticsearch Client的使用详解
May 05 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang数据类型和相互转换
Apr 12 Golang
Golang 链表的学习和使用
Apr 19 Golang
Golang日志包的使用
Apr 20 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 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
西德产收音机
2021/03/01 无线电
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
PDO::quote讲解
2019/01/29 PHP
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
jquery 实现复选框的全选操作实例代码
2017/01/24 Javascript
简单实现bootstrap选项卡效果
2017/02/08 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
vue实现axios图片上传功能
2019/08/20 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
JS实现星星海特效
2019/12/24 Javascript
python 实现归并排序算法
2012/06/05 Python
python获取标准北京时间的方法
2015/03/24 Python
使用Python的Scrapy框架十分钟爬取美女图
2016/12/26 Python
python和shell获取文本内容的方法
2018/06/05 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
Django CBV类的用法详解
2019/07/26 Python
使用pandas读取文件的实现
2019/07/31 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
Python实现像awk一样分割字符串
2020/09/15 Python
Dyson戴森波兰官网:Dyson.pl
2019/08/05 全球购物
AURALog面试题软件测试方面
2013/10/22 面试题
技校毕业生的自我评价
2013/12/27 职场文书
计算机系本科生求职信
2014/05/31 职场文书
沙滩主题婚礼活动策划方案
2014/09/15 职场文书
2014年骨干教师工作总结
2014/12/19 职场文书
五年级学生期末评语
2014/12/26 职场文书
党员转正意见怎么写
2015/06/03 职场文书
2015年社区重阳节活动总结
2015/07/30 职场文书
Python制作动态字符画的源码
2021/08/04 Python