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文件的解析非常简单和舒服 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |