英文:
Beego/Golang - Query Values to Struct
问题
我有一个使用Beego框架构建的Golang API,其中有一个查询涉及多个连接,然后返回一个JSON结果。
我希望能够将每一行转换为一个具有更好键名的结构体,例如不是"Stage__Description"而是"Stage"等等...所以我构建了一个ResultMap结构体,其中包含我想要的键名,我应该创建一个Map吗?
查询:
type ResultMap struct {
Id int
DateAdded time.Time
FirstName string
LastName string
Username string
Stage string
Station string
Status string
}
//var maps []ResultMap
var maps []orm.Params
num, err := o.QueryTable("test_result_detail").
Filter("Result__Serial", "121994-0001").
Values(&maps, "id", "date_added", "stage__description", "station__station", "status__status", "operator__username", "operator__first_name", "operator__last_name")
JSON结果
[
{
"DateAdded": "2016-10-20T00:00:00-05:00",
"Id": 8306105,
"Operator__FirstName": "Jose",
"Operator__LastName": "Mendez",
"Operator__Username": "3362",
"Stage__Description": "VR1 Test",
"Station__Station": "TS0653",
"Status__Status": "PASS"
},
{
"DateAdded": "2016-10-20T00:00:00-05:00",
"Id": 8306465,
"Operator__FirstName": "Jose",
"Operator__LastName": "Mendez",
"Operator__Username": "3362",
"Stage__Description": "QA Lab X-Ray Inspection",
"Station__Station": "LABEQP-0004",
"Status__Status": "PASS"
},
{
"DateAdded": "2016-10-28T00:00:00-05:00",
"Id": 8547267,
"Operator__FirstName": "Jose",
"Operator__LastName": "Mendez",
"Operator__Username": "3362",
"Stage__Description": "Capture Customer SN",
"Station__Station": "N/A",
"Status__Status": "PASS"
},
{
"DateAdded": "2016-10-28T00:00:00-05:00",
"Id": 8547851,
"Operator__FirstName": "Jose",
"Operator__LastName": "Mendez",
"Operator__Username": "3362",
"Stage__Description": "Final Test",
"Station__Station": "TS0653",
"Status__Status": "PASS"
},
{
"DateAdded": "2017-02-14T00:00:00-06:00",
"Id": 10993864,
"Operator__FirstName": "Jose",
"Operator__LastName": "Mendez",
"Operator__Username": "3362",
"Stage__Description": "QA Mechanical Final Inspection",
"Station__Station": "VISUAL INSPECTION",
"Status__Status": "PASS"
}
]
英文:
I have an API built in Golang using the Beego framework and I have a single query that has multiple joins and then returns a JSON result.
I was hoping there is a way for me to cast each row into a struct which has nicer key names, IE rather than "Stage__Description" just "Stage", etc... So I built a ResultMap struct with the key names I want, should I be creating a Map instead?
Query:
type ResultMap struct {
Id int
DateAdded time.Time
FirstName string
LastName string
Username string
Stage string
station string
status string
}
//var maps []ResultMap
var maps []orm.Params
num, err := o.QueryTable("test_result_detail").
Filter("Result__Serial", "121994-0001").
Values(&maps, "id", "date_added", "stage__description", "station__station", "status__status", "operator__username", "operator__first_name", "operator__last_name" )
JSON RESULT
[
{
"DateAdded": "2016-10-20T00:00:00-05:00",
"Id": 8306105,
"Operator__FirstName": "Jose",
"Operator__LastName": "Mendez",
"Operator__Username": "3362",
"Stage__Description": "VR1 Test",
"Station__Station": "TS0653",
"Status__Status": "PASS"
},
{
"DateAdded": "2016-10-20T00:00:00-05:00",
"Id": 8306465,
"Operator__FirstName": "Jose",
"Operator__LastName": "Mendez",
"Operator__Username": "3362",
"Stage__Description": "QA Lab X-Ray Inspection",
"Station__Station": "LABEQP-0004",
"Status__Status": "PASS"
},
{
"DateAdded": "2016-10-28T00:00:00-05:00",
"Id": 8547267,
"Operator__FirstName": "Jose",
"Operator__LastName": "Mendez",
"Operator__Username": "3362",
"Stage__Description": "Capture Customer SN",
"Station__Station": "N/A",
"Status__Status": "PASS"
},
{
"DateAdded": "2016-10-28T00:00:00-05:00",
"Id": 8547851,
"Operator__FirstName": "Jose",
"Operator__LastName": "Mendez",
"Operator__Username": "3362",
"Stage__Description": "Final Test",
"Station__Station": "TS0653",
"Status__Status": "PASS"
},
{
"DateAdded": "2017-02-14T00:00:00-06:00",
"Id": 10993864,
"Operator__FirstName": "Jose",
"Operator__LastName": "Mendez",
"Operator__Username": "3362",
"Stage__Description": "QA Mechanical Final Inspection",
"Station__Station": "VISUAL INSPECTION",
"Status__Status": "PASS"
}
]
答案1
得分: 1
你想在结构体上使用 JSON 注解,然后使用 json.Unmarshal
将数据放入你的结构体中。
以下是一个示例:
package main
import (
"encoding/json"
"fmt"
)
func main() {
// 你想要存储数据的结构体
// 注意 JSON 标签,它们显示了哪个 JSON 字段对应哪个结构体字段
type Data struct {
FirstName string `json:"Operator__FirstName"`
LastName string `json:"Operator__LastName"`
}
// 创建一个这些结构体的切片,因为我们的 JSON 是一个结果数组
var structData []Data
// 你想要转换为结构体的 JSON 数据
jsonData := []byte(`[{"Operator__FirstName": "Bob", "Operator__LastName": "Smith"},{"Operator__FirstName": "John", "Operator__LastName": "Adams"}]`)
_ = json.Unmarshal(jsonData, &structData)
fmt.Printf("%+v", structData)
}
你可以在 Go Playground 上查看这个示例:https://play.golang.org/p/Z2P7oUVT9i
英文:
You want to use json annotations on your struct, then use json.Unmarshal
to put the data into your struct.
Here is an example:
package main
import (
"encoding/json"
"fmt"
)
func main() {
// The struct you want to store the data in
// Note the json tags that show which json field corresponds to which struct field
type Data struct {
FirstName string `json:"Operator__FirstName"`
LastName string `json:"Operator__LastName"`
}
// Create a slice of these structs since our json is an array of results
var structData []Data
// The json you want to dump into the structs
jsonData := []byte(`[{"Operator__FirstName": "Bob", "Operator__LastName": "Smith"},{"Operator__FirstName": "John", "Operator__LastName": "Adams"}]`)
_ = json.Unmarshal(jsonData, &structData)
fmt.Printf("%+v", structData)
}
And here it is in Go Playground: https://play.golang.org/p/Z2P7oUVT9i
答案2
得分: 0
你也可以使用MVC模式。如果你想使用MVC,你需要创建一个models包并将模型注册到数据库中。
package models
import (
"time"
"github.com/astaxie/beego/orm"
)
type ResultMap struct {
Id int `orm:"auto"`
DateAdded time.Time `orm:"type(datetime)"`
FirstName string `orm:"size(255)"`
LastName string `orm:"size(255)"`
Username string `orm:"size(255)"`
Stage string `orm:"size(255)"`
Station string `orm:"size(255)"`
Status string `orm:"size(255)"`
}
func init() {
orm.RegisterModel(
new(ResultMap),
)
}
然后你可以在控制器中按照你的需求选择模型作为数据(切片或单个变量)。
func main() {
var mySlice []models.ResultMap
_, err := orm.NewOrm().QueryTable("ResultMap").Filter("FirstName", "Bob").All(&mySlice)
if err != nil {
fmt.Println("Database Error:", err)
return
}
for _, value := range mySlice {
fmt.Println("Firstname:", value.FirstName)
}
}
英文:
You can also use MVC pattern. If you want to use MVC, you need to create models package and register the model to database.
package models
import (
"time"
"github.com/astaxie/beego/orm"
)
type ResultMap struct {
Id int `orm:"auto"`
DateAdded time.Time `orm:"type(datetime)"`
FirstName string `orm:"size(255)"`
LastName string `orm:"size(255)"`
Username string `orm:"size(255)"`
Stage string `orm:"size(255)"`
station string `orm:"size(255)"`
status string `orm:"size(255)"`
}
func init() {
orm.RegisterModel(
new(ResultMap),
)
}
Then you can select your data as model in your controller as you want(slice or single variable).
func main() {
var mySlice []models.ResultMap
_,err := orm.NewOrm().QueryTable("ResultMap").Filter("FirstName","Bob").All(&mySlice)
if err != nil {
fmt.Println("Database Error: ",err)
return
}
for _, value := range mySlice {
fmt.Println("Firstname: ",value.FirstName)
}
}
You can check model definition and ORM usage
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论