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 gorm踩过的坑
Apr 30 Golang
golang 实现并发求和
May 08 Golang
聊聊golang中多个defer的执行顺序
May 08 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
golang使用map实现去除重复数组
Apr 14 Golang
Golang 遍历二叉树
Apr 19 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
Go语言测试库testify使用学习
Jul 23 Golang
Go中使用gjson来操作JSON数据的实现
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字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
php include和require的区别深入解析
2013/06/17 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
两级联动select刷新后其值保持不变的实现方法
2014/01/27 PHP
PHP上传图片时判断上传文件是否为可用图片的方法
2016/10/20 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
用jscript实现新建和保存一个word文档
2007/06/15 Javascript
用JavaScrpt实现文件夹简单轻松加密的实现方法图文
2008/09/08 Javascript
js checkbox(复选框) 使用集锦
2009/04/28 Javascript
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
Jquery判断IE6等浏览器的代码
2011/04/05 Javascript
js中的this关键字详解
2013/09/25 Javascript
利用Node.JS实现邮件发送功能
2016/10/21 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
一步步教你利用webpack如何搭一个vue脚手架(超详细讲解和注释)
2018/01/08 Javascript
jQuery实现输入框的放大和缩小功能示例
2018/07/21 jQuery
解决vue热替换失效的根本原因
2018/09/19 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
使用python BeautifulSoup库抓取58手机维修信息
2013/11/21 Python
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
python 编程之twisted详解及简单实例
2017/01/28 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
Python实现简易过滤删除数字的方法小结
2019/01/09 Python
python实现五子棋小程序
2019/06/18 Python
Python-接口开发入门解析
2019/08/01 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
python -v 报错问题的解决方法
2020/09/15 Python
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
转党组织关系介绍信
2014/01/08 职场文书
校运会入场式解说词
2014/02/10 职场文书
大学优秀班主任事迹材料
2014/05/02 职场文书
葬礼主持词
2015/07/02 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书
导游词之青城山景区
2019/09/27 职场文书