前端之家收集整理的这篇文章主要介绍了
golang 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':%s\n",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%s\n",buffer)
buffer,err=StripComments(buffer)//去掉注释
iferr!=nil{
emit("Failedtostripcommentsfromjson:%s\n",err)
return
}
buffer=[]byte(os.ExpandEnv(string(buffer)))//特殊
err=json.Unmarshal(buffer,&config)//解析json格式数据
iferr!=nil{
emit("Failedunmarshallingjson:%s\n",err)
return
}
fmt.Printf("111111111%s\n",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:%s\n",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配置文件:@H_301_3@
##jsonformatfile
{
"network":{
"servers":["localhost:5043"]
},"files":[
{
"paths":[""]
}
]
}
输出结果:@H_301_3@
111111111[localhost:5043]
2015/10/0516:45:21
##jsonformatfile
{
"network":{
"servers":["localhost:5043"]
},"files":[
{
"paths":[""]
}
]
}
可见,golang对json文件的解析非常简单和舒服@H_301_3@