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语言map与string的相互转换的实现
Apr 07 Golang
go语言求任意类型切片的长度操作
Apr 26 Golang
彻底理解golang中什么是nil
Apr 29 Golang
golang switch语句的灵活写法介绍
May 06 Golang
go xorm框架的使用
May 22 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
浅谈GO中的Channel以及死锁的造成
Mar 18 Golang
Golang日志包的使用
Apr 20 Golang
深入理解 Golang 的字符串
May 04 Golang
Go语言入门exec的基本使用
May 20 Golang
Go Grpc Gateway兼容HTTP协议文档自动生成网关
Jun 16 Golang
Go 内联优化让程序员爱不释手
Jun 21 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面向对象全攻略 (七) 继承性
2009/09/30 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
PHP 查找字符串常用函数介绍
2012/06/07 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
PHP设置头信息及取得返回头信息的方法
2016/01/25 PHP
CodeIgniter框架数据库基本操作示例
2018/05/24 PHP
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
为react组件库添加typescript类型提示的方法
2020/06/15 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
[01:03]悬念揭晓 11月26日DOTA2完美盛典不见不散
2017/11/23 DOTA
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
python tkinter控件布局项目实例
2019/11/04 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
利用CSS3把图片变成灰色模式的实例代码
2016/09/06 HTML / CSS
享受加州生活方式的时尚舒适:XCVI
2018/07/09 全球购物
致跳远、跳高运动员广播稿
2014/01/09 职场文书
银行批评与自我批评
2014/02/10 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
《火烧云》教学反思
2014/04/12 职场文书
我爱我家教学反思
2014/05/01 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
基层党员四风问题自我剖析材料
2014/09/29 职场文书
高三语文复习计划
2015/01/19 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
win10键盘驱动怎么修复?Win10键盘驱动修复小技巧
2022/04/06 数码科技