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 原生http web 服务跨域restful api的写法介绍
Apr 27 Golang
彻底理解golang中什么是nil
Apr 29 Golang
golang elasticsearch Client的使用详解
May 05 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
Go 语言中 20 个占位符的整理
Oct 16 Golang
golang操作rocketmq的示例代码
Apr 06 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Go语言grpc和protobuf
Apr 13 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
Go gRPC进阶教程gRPC转换HTTP
Jun 16 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
DIY实用性框形天线
2021/03/02 无线电
国外比较好的几个的Php开源建站平台小结
2010/04/22 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
PHP使用内置函数file_put_contents写入文件及追加内容的方法
2015/12/07 PHP
php微信公众平台配置接口开发程序
2016/09/22 PHP
js中如何把字符串转化为对象、数组示例代码
2013/07/17 Javascript
JS调用CS里的带参方法实例
2013/08/01 Javascript
D3.js 从P元素的创建开始(显示可加载数据)
2014/10/30 Javascript
jquery复选框多选赋值给文本框的方法
2015/01/27 Javascript
JavaScript返回当前会话cookie全部键值对照的方法
2015/04/03 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
JavaScript编程的单例设计模讲解
2015/11/10 Javascript
实例解析angularjs的filter过滤器
2016/12/14 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
在vue-cli搭建的项目中增加后台mock接口的方法
2018/04/26 Javascript
微信小程序实现随机验证码功能
2018/12/20 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
Vue3为什么这么快
2020/09/23 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
对Python 窗体(tkinter)树状数据(Treeview)详解
2018/10/11 Python
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
Python全栈之列表数据类型详解
2019/10/01 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
python在地图上画比例的实例详解
2020/11/13 Python
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
海量信息软件测试笔试题
2015/08/08 面试题
党员对照检查材料思想汇报
2014/09/16 职场文书
敲诈同学钱财检讨书范文
2014/11/18 职场文书
2014小学一年级班主任工作总结
2014/12/05 职场文书
Java界面编程实现界面跳转
2022/06/16 Java/Android