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 相关文章推荐
goland 清除所有的默认设置操作
Apr 28 Golang
golang通过递归遍历生成树状结构的操作
Apr 28 Golang
golang 生成对应的数据表struct定义操作
Apr 28 Golang
解决go在函数退出后子协程的退出问题
Apr 30 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
golang定时器
Apr 14 Golang
Golang入门之计时器
May 04 Golang
Go Grpc Gateway兼容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
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
URL地址中的#符号使用说明
2011/02/12 Javascript
使用JS CSS去除IE链接虚线框的三种方法
2013/11/14 Javascript
JS 实现列表与多选框选择附预览动画
2014/10/29 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
2016/05/03 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
2017/03/06 Javascript
React应用中使用Bootstrap的方法
2017/08/15 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
基于nodejs res.end和res.send的区别
2018/05/14 NodeJs
JS实现区分中英文并统计字符个数的方法示例
2018/06/09 Javascript
angular 内存溢出的问题解决
2018/07/12 Javascript
JavaScript交换两个变量方法实例
2019/11/25 Javascript
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
Python实现的字典值比较功能示例
2018/01/08 Python
利用Python如何生成便签图片详解
2018/07/09 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
python 中值滤波,椒盐去噪,图片增强实例
2019/12/18 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
python 用opencv实现图像修复和图像金字塔
2020/11/27 Python
CSS3 圆角效果
2009/07/15 HTML / CSS
阿联酋团购网站:Groupon阿联酋
2016/10/14 全球购物
Sneaker Studio罗马尼亚网站:购买运动鞋
2018/11/04 全球购物
公司前台接待岗位职责
2013/12/03 职场文书
单位办理社保介绍信
2014/01/10 职场文书
2014年中秋寄语
2014/08/11 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
高三生物教学反思
2016/02/22 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
浅谈Laravel中使用Slack进行异常通知
2021/05/29 PHP
如何利用Python实现一个论文降重工具
2021/07/09 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python
MySQL transaction事务安全示例讲解
2022/06/21 MySQL