JSON

golang json 格式文件解析

字号+ 作者:H5之家 来源:H5之家 2015-11-03 11:11 我要评论( )

package main import ( bytes encoding/json fmt log os regexp time ) const configFileSizeLimit = 10 20 var defaultConfig = struct { netTimeout int64 fil

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",path,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配置文件:

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

输出结果:

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

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

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • golang的json操作

    golang的json操作

    2015-11-22 10:36

  • golang json解析之大小写

    golang json解析之大小写

    2015-10-15 17:30

  • json _ golang

    json _ golang

    2015-10-04 16:04

网友点评