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 空map和未初始化map的注意事项说明
Apr 29 Golang
golang slice元素去重操作
Apr 30 Golang
go 实现简易端口扫描的示例
May 22 Golang
深入理解go slice结构
Sep 15 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Go语言 详解net的tcp服务
Apr 14 Golang
golang语言指针操作
Apr 14 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang获取List列表元素的四种方式
Apr 20 Golang
Golang map映射的用法
Apr 22 Golang
Golang 实现WebSockets
Apr 24 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 session和cookie使用说明
2010/04/07 PHP
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
在网页中控制wmplayer播放器
2006/07/01 Javascript
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
基于jquery的无限级联下拉框js插件
2011/10/29 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
EditPlus注册码生成器(js代码实现)
2013/03/25 Javascript
Jquery easyui 下loaing效果示例代码
2013/08/12 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
jQuery代码实现表格中点击相应行变色功能
2016/05/09 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
vue脚手架项目创建步骤详解
2021/03/02 Vue.js
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
使用python实现扫描端口示例
2014/03/29 Python
详解Python中contextlib上下文管理模块的用法
2016/06/28 Python
Python3 中文文件读写方法
2018/01/23 Python
Python中is和==的区别详解
2018/11/15 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
Python调用JavaScript代码的方法
2020/10/27 Python
极简的HTML5模版
2015/07/09 HTML / CSS
Brora官网:英国领先的羊绒服装品牌
2019/08/28 全球购物
JAVA程序设计笔试题面试题一套
2015/07/28 面试题
文员个人求职自荐信
2013/09/21 职场文书
幼儿园校车司机的岗位职责
2014/01/30 职场文书
环保倡议书怎么写
2014/05/16 职场文书
通报表扬范文
2015/01/17 职场文书
护理专业自荐信范文
2015/03/06 职场文书
杨善洲电影观后感
2015/06/04 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle
用Python将GIF动图分解成多张静态图片
2021/06/11 Python
Java设计模式之代理模式
2022/04/22 Java/Android