我写a library,可以使这个更容易使用。该Reports
可解组对你的JSON格式:
package main
import (
"time"
"github.com/go-restit/lzjson"
)
type Section struct {
Bytes int `json:"num"`
Files int `json:"type"`
Timestamp time.Time `json:"timestamp"`
}
type Report struct {
Server string
Guest string
Service string
Part string
Details Section
}
type Reports []Report
func (reports *Reports) UnmarshalJSON(content []byte) (err error) {
root := lzjson.NewNode()
if err = json.Unmarshal(content, &root); err != nil {
return
}
// reset the slice of reports
*reports = make([]Report, 0, 10)
for _, serverName := range root.GetKeys() {
server := root.Get(serverName)
if err = server.Error(); err != nil {
return
}
for _, guestName := range server.GetKeys() {
guest := server.Get(guestName)
if err = guest.Error(); err != nil {
return
}
for _, serviceName := range guest.GetKeys() {
service := guest.Get(serviceName)
if err = service.Error(); err != nil {
return
}
for _, partName := range service.GetKeys() {
part := service.Get(partName)
if err = part.Error(); err != nil {
return
}
var report Report
timestamp, _ := time.Parse("2006-01-02T15:04:05Z", part.Get("timestamp").String())
report.Server = serverName
report.Guest = guestName
report.Service = serviceName
report.Part = partName
report.Details = Section{
Bytes: part.Get("num").Int(),
Files: part.Get("type").Int(),
Timestamp: timestamp,
}
*reports = append(*reports, report)
}
}
}
}
return
}
现在你可以这样做:
package main
import (
"encoding/json"
"log"
)
func main() {
raw := `
{
"<server 1>": {
"<guest>": {
"<service>": {
"<part>": {
"num": "<number>",
"type": "<type>",
"timestamp": "2016-02-01T12:53:12Z"
}
}
}
},
"<server 2>": {
"<guest>": {
"<service>": {
"<part>": {
"num": "<number>",
"type": "<type>",
"timestamp": "2016-02-01T12:53:12Z"
}
}
}
}
}`
var reports Reports
err := json.Unmarshal([]byte(raw), &reports)
if err != nil {
log.Fatalf("error reading reports: %s", err.Error())
}
log.Printf("Reports: %#v", reports)
}
里面' “” 文本'const或不?例如:''或只是''? –
2016-10-05 07:24:58
@Amd中的文字正在改变。这就是为什么我需要保持它unmarshlling后,我可以进一步工作。 –
shivams
是否可以稍微改变你的JSON格式?例如'{ “服务器”: “Server12”, “客人”: “Guest2”, “服务”: “服务2”, “部分”: “第2部分”, “详细信息”:{ “字节”:1, “文件”:2 ,“Timestamp”:“2016-10-05T07:21:22.9887031Z”}}'或者它超出了你的控制范围? – 2016-10-05 07:30:17