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原生库的中bytes.Buffer用法
Apr 25 Golang
golang正则之命名分组方式
Apr 25 Golang
Go语言切片前或中间插入项与内置copy()函数详解
Apr 27 Golang
Golang 空map和未初始化map的注意事项说明
Apr 29 Golang
解决golang在import自己的包报错的问题
Apr 29 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
Go 自定义package包设置与导入操作
May 06 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
go使用Gin框架利用阿里云实现短信验证码功能
Aug 04 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 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
用cookies来跟踪识别用户
2006/10/09 PHP
人大复印资料处理程序_输入篇
2006/10/09 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
php获取Google机器人访问足迹的方法
2015/04/15 PHP
jQueryUI的Dialog的简单封装
2010/06/07 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
使用JavaScript构建JSON格式字符串实现步骤
2013/03/22 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
Bootstrap源码解读网格系统(3)
2016/12/22 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
对tf.reduce_sum tensorflow维度上的操作详解
2018/07/26 Python
django的model操作汇整详解
2019/07/26 Python
python3 反射的四种基本方法解析
2019/08/26 Python
Python实现Restful API的例子
2019/08/31 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
python实现ftp文件传输功能
2020/03/20 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
解决tensorflow模型压缩的问题_踩坑无数,总算搞定
2021/03/02 Python
CSS3中线性颜色渐变的一些实现方法
2015/07/14 HTML / CSS
美国美发品牌:Bumble and Bumble
2016/10/08 全球购物
印度最大的网上花店:Ferns N Petals(鲜花、礼品和蛋糕)
2017/10/16 全球购物
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
专科毕业生求职简历的自我评价
2013/10/12 职场文书
安全生产月演讲稿
2014/05/09 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
python基础之类方法和静态方法
2021/10/24 Python
Java数据结构之堆(优先队列)
2022/05/20 Java/Android