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 08 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
golang 实现Location跳转方式
May 02 Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 Golang
Go语言基础知识点介绍
Jul 04 Golang
go开发alertmanger实现钉钉报警
Jul 16 Golang
基于Go语言构建RESTful API服务
Jul 25 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
golang三种设计模式之简单工厂、方法工厂和抽象工厂
Apr 10 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Golang解析JSON对象
Apr 30 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
Syphon 虹吸式咖啡壶冲煮–拨动法
2021/03/03 冲泡冲煮
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
jQuery向后台传入json格式数据的方法
2015/02/13 Javascript
JQuery中Bind()事件用法分析
2015/05/05 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
详解webpack进阶之loader篇
2017/08/23 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
mocha的时序规则讲解
2019/02/16 Javascript
Python3.6简单操作Mysql数据库
2017/09/12 Python
python中找出numpy array数组的最值及其索引方法
2018/04/17 Python
目前最全的python的就业方向
2018/06/05 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
python爬取内容存入Excel实例
2019/02/20 Python
python小项目之五子棋游戏
2019/12/26 Python
Pytorch转tflite方式
2020/05/25 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
2020/09/02 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
html5+svg学习指南之SVG基础知识
2014/12/17 HTML / CSS
美国娱乐和流行文化商品店:FYE
2017/09/14 全球购物
Expedia韩国官网:亚洲发展最快的在线旅游门户网站
2018/02/26 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
介绍一下XMLHttpRequest对象
2012/02/12 面试题
如何通过jdbc调用存储过程
2012/04/19 面试题
网上快餐厅创业计划书
2014/02/01 职场文书
音乐兴趣小组活动总结
2014/07/07 职场文书
幼儿园教师师德师风演讲稿:我自豪我是一名幼师
2014/09/10 职场文书
购房协议书范本(无房产证)
2014/10/07 职场文书
群众路线批评与自我批评发言稿
2014/10/16 职场文书
交通事故协议书范本
2014/11/18 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python