我正在尝试通过MySQL将sphinx查询转换为golang结构并且很难。看起来这应该是一个常见的问题,但到目前为止,我仍然无法将其转换为地图或解析输出。具体来说,我在sphinx中有一个模式,看起来像{来源:{ID:string,subId:string,Campaigns:[] {CampaignID:string,Status:string}}}
我尝试过使用简单的rows.scan,但这并不能帮助我解析重复字段,我只是将其作为未解析的字符串。在sphinx中,键不在引号中,因此JSON.unmarshal似乎根本没有帮助。使用sqlx,我试图建立以下结构
type CampaignStatus struct {
CampaignId string
Status string
}
type Source struct {
Id string
SubId string
StatusByCampaign []CampaignStatus
}
type Status struct {
Source
}
并将Status结构传递给Row.ScanStruct()并返回“Missing destination Name Source”错误或者如果我在Status中命名源成员,我得到“sql:列索引0上的扫描错误:不支持扫描,存储driver.Value类型[] uint8到类型* v1.Source“。完全披露,sphinx架构还有一些其他列作为StatusByCampaign的同伴,他们跟在它之后,我不关心它们在我的用例中。
这似乎是以前必须遇到的事情,但我似乎无法在编写自己的解析器之外找到解决方案,我不愿意这样做。
答案 0 :(得分:1)
我发现我正在使用的遗留系统正在使用一个名为ServiceStack的ASP.Net库来序列化/反序列化我的sphinx数据库,它正在使用它自己的自定义JSV格式,作者ServiceStack说是JSON和CSV的优化组合,但据我所知,还没有在其他任何地方采用过。
所以看起来我要在Go中重写该库,或者更有可能将索引算法更改为使用JSON。
答案 1 :(得分:0)
我认为这可能是你定义结构的方式。鉴于您提供的json {Source: {ID:string, subId:string, Campaigns:[]{CampaignID:string, Status:string}}}
,您的结构应该看起来像下面的内容。
type object struct {
Source struct {
ID string `db:"id"`
SubId string `db:"sub_id"`
Campaigns []compaign `db:"compaigns"`
} `json:"source"`
}
type compaign struct {
CampaignID string `db:"compaign_id"`
Status string `db:"status"`
}
鉴于以下评论。尝试obj := make(map[string]interaface{})
而不是定义结构。
另外看一下https://github.com/jmoiron/sqlx结构应该使用db标志而不是json,所以我改了它。您不应该编组数据
示例db.Select(&people, "SELECT * FROM person ORDER BY first_name ASC")
其中&people
是对结构的引用。 E.g var people PeopleStruct
现在我并不喜欢你的驱动程序,但它应该是相同的,因为你传递对查询的结构或接口的引用,它将数据查找到该引用。在查询之后,通常不必在结构中解组。