当前位置 博文首页 > go语言中json数据的读取和写出操作

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

    作者:choumin 时间:2021-06-02 18:06

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

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

    js
    下一篇:没有了