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 相关文章推荐
Golang二维切片初始化的实现
Apr 08 Golang
go结构体嵌套的切片数组操作
Apr 28 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
go 实现简易端口扫描的示例
May 22 Golang
Golang二维数组的使用方式
May 28 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
Golang 入门 之url 包
May 04 Golang
深入理解 Golang 的字符串
May 04 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 register_shutdown_function函数的深入解析
2013/06/03 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
php实现的简易扫雷游戏实例
2015/07/09 PHP
firefox中JS读取XML文件
2006/12/21 Javascript
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
javascript 函数速查表
2010/02/07 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
extjs 如何给column 加上提示
2014/07/29 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
详解js私有作用域中创建特权方法
2016/01/25 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
javascript如何创建对象
2016/08/29 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
解决Python3下map函数的显示问题
2019/12/04 Python
python3读取csv文件任意行列代码实例
2020/01/13 Python
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
家长写给老师的建议书
2014/03/13 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
党员十八大心得体会
2014/09/12 职场文书
2014年销售助理工作总结
2014/12/01 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
2015年化验员工作总结
2015/04/10 职场文书
读书笔记怎么写
2015/07/01 职场文书
《失物招领》教学反思
2016/02/20 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
php png失真的原因及解决办法
2021/10/24 PHP
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers