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 相关文章推荐
golang如何去除多余空白字符(含制表符)
Apr 25 Golang
Go语言带缓冲的通道实现
Apr 26 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
goland 设置project gopath的操作
May 06 Golang
浅谈Go语言多态的实现与interface使用
Jun 16 Golang
Golang的继承模拟实例
Jun 30 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
Golang 对es的操作实例
Apr 20 Golang
Golang获取List列表元素的四种方式
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 Session 变量的使用方法详解与实例代码
2013/09/11 PHP
CodeIgniter常用知识点小结
2016/05/26 PHP
JavaScript调用Activex控件的事件的实现方法
2010/04/11 Javascript
js静态方法与实例方法分析
2011/07/04 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
Java中int与integer的区别(基本数据类型与引用数据类型)
2017/02/19 Javascript
vue实现购物车抛物线小球动画效果的方法详解
2019/02/13 Javascript
vue 获取及修改store.js里的公共变量实例
2019/11/06 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
[01:06:12]VP vs NIP 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python中为什么要用self探讨
2015/04/14 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
python 使用值来排序一个字典的方法
2018/11/16 Python
学生信息管理系统Python面向对象版
2019/01/30 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
浅谈python常用程序算法
2019/03/22 Python
浅谈python 中的 type(), dtype(), astype()的区别
2020/04/09 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
生产部管理制度
2014/01/31 职场文书
库房保管员岗位职责
2014/04/07 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS