go语言中json数据的读取和写出操作

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
 }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Golang map如何生成有序的json数据详解

    前言 本文主要给大家介绍了关于Golang map生成有序json数据的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 先来看一段 Golang 生成 json 的代码,首先定义了一个 map[string]interface{}  的变量,然后存一些值,这里要注意的是 previews 字段,为了浏览器获取到的 json 数据是有序的,所以定义了一个 map[int]map[string]string 的类型,加上了一个表示顺序的键: list := make(map[strin

  • golang通过递归遍历生成树状结构的操作

    业务场景: 一个机构查询科室信息的时候,希望返回树状结构的嵌套格式; 解决办法: 通过递归和指针,嵌套成对应的结构体; 借鉴了前人的代码,但是最后递归的指针调用自己也是调试了半天才出来,这里献上完整的示例代码. package main import ( "fmt" "encoding/json" ) type dept struct { DeptId string `json:"deptId"` FrameDeptStr string `jso

  • goland 恢复已更改文件的操作

    1.查看历史更改文件 点击项目名,右键,选择Local History. 或点击项目名再点击VXA,选择Local History. 然后选择Show History 2.恢复历史已更改文件 选择你想要恢复的文件,右键选择Revert,最后就会恢复到原来的位置了. 补充:goland文件处理 golang是优秀的软件编程语言,由于golang很好的兼容各个系统,我经常使用golang写工具. 写工具经常会用到文件处理,io操作. FileInfo接口 在遍历文件夹的时候回经常用到FileInfo

  • goland 清除所有的默认设置操作

    前不久用goland时,不小心将.tpl文件默认为.go文件.然后就开始报错,setting找了很久,由于英语比较差,翻译了很久还是没有找到恢复默认设置的选项. 最后找到了另一种解决方法.如果有知道怎么在setting中清除设置的朋友,麻烦回复一下啦. 在我首次创建.tpl文件时出现以下选项,因为系统并不知道.tpl文件是什么,所以首次创建需要你选择文件类型. limo当时脑子一热就选了.go文件,所以开始报错 我的解决方法是找到如下路径(系统是Window7) 删除文件(清除了所有的设置) 重

  • golang 实现菜单树的生成方式

    golang 实现菜单树的生成,包括菜单节点的选中状态.半选中状态,菜单的搜索. 1 该包提供两个方法根接口 1.1 GenerateTree(nodes, selectedNodes []INode) (trees []Tree) GenerateTree 自定义的结构体实现 INode 接口后调用此方法生成树结构. 1.2 FindRelationNode(nodes, allNodes []INode) (respNodes []INode) FindRelationNode 在 allT

  • go json数据转发的实现代码

    案例 例如,有个 GET 接口,可以批量获取用户信息

  • go语言中json数据的读取和写出操作

    go自带json库,在使用时需要通过 import "encoding/json"来导入该库. 在读取和写入json数据之前需要定义相关的结构体来对应被操作的json数据的格式,并且结构体中需要导出或导入的变量首字母大写. 其中,json.Marshal()用于将一个对象转换为json格式的字节数组,json.Unmarshal()用于将json格式的字节数组转换为一个对象. 具体使用示例如下所示: 首先,定义结构体: type Com struct { Name string Nod

  • flask框架json数据的拿取和返回操作示例

    本文实例讲述了flask框架json数据的拿取和返回操作.分享给大家供大家参考,具体如下: json数据结构:以套票票网站的城市数据为例,拿到数据莫慌, 1 先分析数据结构,有几个大的字段('returnCode'和'retuenValue'字段,只有一个字段作为定义,另一个字段作为保留(无需处理) 2 键表----> 拆分'returnValue'确定数据库表结构,('A'[]城市首字母表 和  城市具体信息字段{}表) 3 将拿到的数据拆分插入到数据库中 4 将数据库的数据以JSON 的形式

  • OpenCV基础操作指南之图片的读取与写出

    目录 1.进行图片读取的函数是:cv2.imread 2.图片保存的函数cv2.imwrite: 3.图片的显示函数cv2.imshow 附.OpenCV:读取图片总结 总结 1.进行图片读取的函数是:cv2.imread cv2.imread函数语法如下: cv2.imread(filename,flag=1) cv2.imread函数的参数解释: filename:所要读取图片的相对地址(与文件中open函数的读取方式一致) flag:设置读取的格式,默认为1,表示按照BGR三通道的方式进行

  • Javascript中JSON数据分组优化实践及JS操作JSON总结

    现有一堆数据,我需要按时间进行分组,以便前端视图呈现 [ {"date":"2017-12-22","start_time":"10:00:00","end_time":"10:00:00","status":"Performance Time"}, {"date":"2017-12-22","st

  • 在C语言中对utmp文件进行查找和写入操作的函数小结

    C语言pututline()函数:将utmp记录写入文件 头文件: #include <utmp.h> 定义函数: void pututline(struct utmp *ut); 函数说明:pututline()用来将参数ut 的utmp 结构记录到utmp 文件中. 此函数会先用getutid()来取得正确的写入位置, 如果没有找到相符的记录则会加入到utmp 文件尾. 附加说明:需要有写入/var/run/utmp 的权限 范例 #include <utmp.h> main(

  • Android中Json数据读取与创建的方法

    首先介绍下JSON的定义,JSON是JavaScript Object Notation的缩写. 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换.JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. JSON的结构: (1) Name/Value Pairs(无序的):类似所熟知的Keyed list. Hash table.Disctiona

  • 在js与java中判断json数据中是否含有某字段的案例

    js中 从服务端传过来一个json数据为data 1.data["key"] != undefined //这种有缺陷,如果这个key定义了,并且就是很2的赋值为undefined,那么这句就会出问题了 2.!("data" in obj) 3.data.hasOwnProperty("key") //后面两种推荐使用 java程序中判断是否存在 data 为从浏览器传回来的json数据 当读取数据的时候最好先加一个判断,不然如果里面不含有该数据

  • C/C++中CJSON的使用(创建与解析JSON数据)

    目录 一.cJSON介绍 二.JSON简介.语法介绍 2.1 JSON是什么? 2.2 JSON语法介绍 三.cJSON创建简单JSON数据并解析 3.1 新建工程 3.2 创建JSON数据 3.3 解析JSON数据 四.cJSON创建嵌套的对象数据 4.1 创建json数据 4.2 解析JSON数据 五.cJSON带数组的JSON数据 5.1 创建json数据 5.2 解析JSON数据 一.cJSON介绍 cJSON 是一个超轻巧,携带方便,单文件,可以作为 ANSI-C 标准的 JSON 解

  • SpringBoot响应处理之以Json数据返回的实现方法

    目录 一.示例代码 二.返回值解析原理 三.源代码分析(debug) 四.内容协商机制 1. 内容协商 2. 内容协商原理重点源代码 3. HttpMessageConverters消息转换器原理 一.示例代码 访问 localhost:8080/jsonTest —— 返回 json 格式的数据 @Controller public class ResponseTestController { @ResponseBody // 标注 -- 自动返回json数据 @GetMapping("/js

  • go语言中的json与map相互转换实现

    主要是引入 "encoding/json" 包:用到的也就是其中的两个函数json.Marshal和json.Unmarshal. 1.json.Marshal #函数定义位于GOROOT or GOPATH的/src/encoding/json/encode.go 中 func Marshal(v interface{}) ([]byte, error) { e := newEncodeState() err := e.marshal(v, encOpts{escapeHTML: t

随机推荐