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语言-在mac下brew升级golang
Apr 25 Golang
golang中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
Golang中异常处理机制详解
Jun 08 Golang
详解Golang如何优雅的终止一个服务
Mar 21 Golang
Go语言特点及基本数据类型使用详解
Mar 21 Golang
golang为什么要统一错误处理
Apr 03 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Go web入门Go pongo2模板引擎
May 20 Golang
Go微服务项目配置文件的定义和读取示例详解
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
php eval函数用法总结
2012/10/31 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
mac系统下为 php 添加 pcntl 扩展
2016/08/28 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
jQuery自定义添加"$"与解决"$"冲突的方法
2015/01/19 Javascript
JavaScript常用的弹出广告及背投广告实现方法
2015/02/06 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
jQuery点击页面其他部分隐藏下拉菜单功能
2018/11/27 jQuery
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
Nodejs环境实现socket通信过程解析
2020/07/03 NodeJs
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
js中实现继承的五种方法
2021/01/25 Javascript
详解Python中的静态方法与类成员方法
2017/02/28 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
Python实现识别图片内容的方法分析
2018/07/11 Python
python 在指定范围内随机生成不重复的n个数实例
2019/01/28 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
Python占用的内存优化教程
2019/07/28 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
医药销售求职信范文
2014/02/01 职场文书
优秀广告词大全
2014/03/19 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
李开复演讲稿
2014/05/24 职场文书
中药学自荐信
2014/06/15 职场文书
党的群众路线教育实践活动个人对照检查材料
2014/09/22 职场文书
2014年教育实习工作总结
2014/11/22 职场文书
满月酒邀请函
2015/01/30 职场文书
工作能力自我评价2015
2015/03/05 职场文书
PHP实现考试倒计时功能代码
2021/04/16 PHP
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
JS数组方法some、every和find的使用详情
2021/10/05 Javascript