加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang json 格式文件解析

发布时间:2020-12-16 18:38:46 所属栏目:大数据 来源:网络整理
导读:packagemainimport("bytes""encoding/json""fmt""log""os""regexp""time")constconfigFileSizeLimit=1020vardefaultConfig=struct{netTimeoutint64fileDeadtimestring}{netTimeout:15,fileDeadtime:"24h",}//有了`json:network`这种注释,后面json解析就可以
packagemain

import(
	"bytes"
	"encoding/json"
	"fmt"
	"log"
	"os"
	"regexp"
	"time"
)

constconfigFileSizeLimit=10<<20

vardefaultConfig=&struct{
	netTimeoutint64
	fileDeadtimestring
}{
	netTimeout:15,fileDeadtime:"24h",}

//有了`json:network`这种注释,后面json解析就可以把相应的数据塞到对应的结构里面来
typeConfigstruct{
	NetworkNetworkConfig`json:network`
	Files[]FileConfig`json:files`
}

typeNetworkConfigstruct{
	Servers[]string`json:servers`
	SSLCertificatestring`json:"sslcertificate"`
	SSLKeystring`json:"sslkey"`
	SSLCAstring`json:"sslca"`
	Timeoutint64`json:timeout`
	timeouttime.Duration
}

typeFileConfigstruct{
	Paths[]string`json:paths`
	Fieldsmap[string]string`json:fields`
	DeadTimestring`json:"deadtime"`
	deadtimetime.Duration
}

funcmain(){
	LoadConfig("E:/golang/src/github.com/test/logstast_forwarder.conf")
}

funcLoadConfig(pathstring)(configConfig,errerror){
	config_file,err:=os.Open(path)
	iferr!=nil{
		emit("Failedtoopenconfigfile'%s':%sn",path,err)
		return
	}

	fi,_:=config_file.Stat()
	ifsize:=fi.Size();size>(configFileSizeLimit){
		emit("configfile(%q)sizeexceedsreasonablelimit(%d)-aborting",size)
		return//REVU:shouldn'tthisreturnanerror,then?
	}

	iffi.Size()==0{
		emit("configfile(%q)isempty,skipping",path)
		return
	}

	buffer:=make([]byte,fi.Size())
	_,err=config_file.Read(buffer)
	emit("n%sn",buffer)

	buffer,err=StripComments(buffer)//去掉注释
	iferr!=nil{
		emit("Failedtostripcommentsfromjson:%sn",err)
		return
	}

	buffer=[]byte(os.ExpandEnv(string(buffer)))//特殊

	err=json.Unmarshal(buffer,&config)//解析json格式数据
	iferr!=nil{
		emit("Failedunmarshallingjson:%sn",err)
		return
	}
fmt.Printf("222221111%sn",config.Network.Servers)
	fork,_:=rangeconfig.Files{
		ifconfig.Files[k].DeadTime==""{
			config.Files[k].DeadTime=defaultConfig.fileDeadtime
		}
		config.Files[k].deadtime,err=time.ParseDuration(config.Files[k].DeadTime)
		iferr!=nil{
			emit("Failedtoparsedeadtimeduration'%s'.Errorwas:%sn",config.Files[k].DeadTime,err)
			return
		}
	}

	return
}

funcStripComments(data[]byte)([]byte,error){
	data=bytes.Replace(data,[]byte("r"),[]byte(""),0)//Windows
	lines:=bytes.Split(data,[]byte("n"))//splittomulilines
	filtered:=make([][]byte,0)

	for_,line:=rangelines{
		match,err:=regexp.Match(`^s*#`,line)
		iferr!=nil{
			returnnil,err
		}
		if!match{
			filtered=append(filtered,line)
		}
	}

	returnbytes.Join(filtered,[]byte("n")),nil
}

funcemit(msgfmtstring,args...interface{}){
	log.Printf(msgfmt,args...)
}

json配置文件:

##jsonformatfile
{
"network":{
"servers":["localhost:5043"]
},"files":[
{
"paths":[""]

}
]
}

输出结果:

222221111[localhost:5043]
	
	2015/10/0516:45:21
	##jsonformatfile
	{
	"network":{
	"servers":["localhost:5043"]
	},"files":[
	{
	"paths":[""]
	
	}
	]
	}

可见,golang对json文件的解析非常简单和舒服

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读