我正在尝试创建一个端点 Go API 以供前端 JavaScript 图形库使用。
应该发生什么:
- /data 端点以获取 JSON 数据数组。
- 数据只是一片 go 结构,在这个例子中只有两个,但它将超过 10000。
- 图形库需要额外的元数据。它被保存为一个名为 AdditionalInfo 的变量。
- 问题是当我想对 AdditionalInfo + AllAgents 进行编码时,它不允许我将字符串与结构片段连接起来。
- 在结构 slice 的末尾还需要一个 ]` 使其成为有效的 JSON
问题:
- 如何在结构 slice 的前后添加额外数据?
- 将结构附加到结构 slice 是否有效?
创建一个已知长度的 slice 然后使用范围附加到它会更好吗?
package main import ( "encoding/json" "fmt" "log" "net/http" "os" ) func main() { port := os.Getenv("PORT") if port == "" { port = "443" log.Printf("Defaulting to port %s", port) } http.HandleFunc("/data", TrySnipped) log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil)) } func TrySnipped(w http.ResponseWriter, r *http.Request) { w.Header().Add("Content-Type", "application/json") var AllAgents []SingleAgent AllAgents = append(AllAgents, FirstAgent) AllAgents = append(AllAgents, SecondAgent) json.NewEncoder(w).Encode(AllAgents) } var AdditionalInfo = `"meta": { "page": 1, "pages": 1, "perpage": -1, "total": 350, "sort": "asc", "field": "RecordID" }, "data": [` type SingleAgent struct { RecordID string `json:"RecordID"` OldEmployeeID string `json:"OldEmployeeID"` NewEmployeeID string `json:"NewEmployeeID"` AgentRank int `json:"AgentRank"` AgentName string `json:"AgentName"` AgentEmail string `json:"AgentEmail"` TeamManager string `json:"TeamManager"` LineOfBusiness string `json:"LineOfBusiness"` FitnessCampStartDate string `json:"FitnessCampStartDate"` FitnessCampEndDate string `json:"FitnessCampEndDate"` FitnessCampStatus int `json:"FitnessCampStatus"` AgentFitnessRank int `json:"AgentFitnessRank"` LatestMetricA int `json:"MetricA"` LatestMetricB int `json:"MetricB"` LatestMetricC int `json:"MetricC"` LatestMetricD int `json:"MetricD"` LatestMetricE int `json:"MetricD"` SiteName string `json:"SiteName"` SiteID string `json:"SiteID"` PostCampWeek1 string `json:"PostCampWeek1"` PostCampWeek2 string `json:"PostCampWeek2"` PostCampWeek3 string `json:"PostCampWeek3"` } var FirstAgent = SingleAgent{ RecordID: "30", OldEmployeeID: "785114544", NewEmployeeID: "10785114544", AgentRank: 3, AgentName: "Shandeigh Rawsen", AgentEmail: "shandeigh.rawsen@gmail.com", TeamManager: "Oliver Lamplugh", LineOfBusiness: "BMS", FitnessCampStartDate: "8/13/2018", FitnessCampEndDate: "10/7/2018", FitnessCampStatus: 1, AgentFitnessRank: 1, LatestMetricA: 77, LatestMetricB: 167, LatestMetricC: 496, LatestMetricD: 72, LatestMetricE: 80, SiteName: "Montreal", SiteID: "4", PostCampWeek1: "10/2/2018", PostCampWeek2: "10/9/2018", PostCampWeek3: "10/19/2018", } var SecondAgent = SingleAgent{ RecordID: "29", OldEmployeeID: "980433290", NewEmployeeID: "10980433290", AgentRank: 4, AgentName: "Terrijo Dewberry", AgentEmail: "terrijo.deberry@gmail.com", TeamManager: "Oliver Lamplugh", LineOfBusiness: "BTSW", FitnessCampStartDate: "7/28/2018", FitnessCampEndDate: "9/23/2018", FitnessCampStatus: 2, AgentFitnessRank: 2, LatestMetricA: 88, LatestMetricB: 92, LatestMetricC: 716, LatestMetricD: 78, LatestMetricE: 66, SiteName: "Montreal", SiteID: "2", PostCampWeek1: "10/2/2018", PostCampWeek2: "10/9/2018", PostCampWeek3: "10/15/2018", }
最佳答案
将附加信息、代理和右大括号写入响应:
io.WriteString(w, "{")
io.WriteString(w, AdditionalInfo)
json.NewEncoder(w).Encode(AllAgents)
io.WriteString(w, "]}") // closing ] for data and closing } for root
请注意,这对代理进行了两级 [ ]
编码。不清楚这是否是您想要的。
另一种方法是创建一个匹配输出结构的 Go 值并对其进行编码:
v := map[string]interface{}{
"meta": map[string]interface{}{
"page": 1,
"pages": 1,
"perpage": -1,
"total": 350,
"sort": "asc",
"field": "RecordID",
},
"data": AllAgents,
}
if err := json.NewEncoder(w).Encode(v); err != nil {
// handle error
}
同样,不清楚您需要在代理周围嵌套多少。您可能需要这种变体:
v := map[string]interface{}{
"meta": map[string]interface{}{
"page": 1,
"pages": 1,
"perpage": -1,
"total": 350,
"sort": "asc",
"field": "RecordID",
},
"data": []interface{}{AllAgents},
}
if err := json.NewEncoder(w).Encode(v); err != nil {
// handle error
}
re: Efficiency 创建最终大小的 slice 通常比使用 append
增量增长 slice 更有效。通过使用指针 slice []*SingleAgent
而不是结构值 slice []SingleAgent
可能会获得一些效率。
关于go - 将一个字符串连接到一个结构片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52938206/