微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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配置文件

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

}
]
}

输出结果:

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

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

原文地址:https://www.jb51.cc/go/190176.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐