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项目中使用init()
Apr 12 Golang
golang判断key是否在map中的代码
Apr 24 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
Golang中interface{}转为数组的操作
Apr 30 Golang
解决golang 关于全局变量的坑
May 06 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
golang操作redis的客户端包有多个比如redigo、go-redis
Apr 14 Golang
实现GO语言对数组切片去重
Apr 20 Golang
Golang 切片(Slice)实现增删改查
Apr 22 Golang
Go语言怎么使用变长参数函数
Jul 15 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来改写404错误页让你的页面更友好
2013/01/24 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
PHP实现的下载远程文件类定义与用法示例
2017/07/05 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
2018/04/20 PHP
脚本吧 - 幻宇工作室用到js,超强推荐base.js
2006/12/23 Javascript
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
jquery.cookie() 方法的使用(读取、写入、删除)
2013/12/05 Javascript
javascript处理表单示例(javascript提交表单)
2014/04/28 Javascript
初识Javascript小结
2015/07/16 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
AngularJS中的JSONP实例解析
2016/12/01 Javascript
nodeJs链接Mysql做增删改查的简单操作
2017/02/04 NodeJs
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
JS可断点续传文件上传实现代码解析
2020/07/30 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
JS实现鼠标移动拖尾
2020/12/27 Javascript
iview实现动态表单和自定义验证时间段重叠
2021/01/10 Javascript
Python迭代用法实例教程
2014/09/08 Python
Pycharm小白级简单使用教程
2020/01/08 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
AmazeUI图片轮播效果的示例代码
2020/08/20 HTML / CSS
专科毕业生就业推荐信
2013/11/01 职场文书
中专毕业生自荐信
2013/11/16 职场文书
学校教师安全责任书
2014/07/23 职场文书
2014年物流工作总结
2014/11/25 职场文书
幼儿园辞职信范文
2015/02/27 职场文书
2015年政协委员工作总结
2015/05/20 职场文书
婚庆司仪开场白
2015/05/29 职场文书
八年级语文教学反思
2016/03/03 职场文书
详解在OpenCV中如何使用图像像素
2022/03/03 Python