【发布时间】:2021-02-24 19:52:32
【问题描述】:
我正在尝试使用 MSSQL JSON AUTO 轻松地从查询转到 Go 结构。返回的数据看起来 jsony,但在将其从字符串转换为我想要的已知结构时遇到了麻烦。
func main() {
type LOBData struct {
COB_ID int `json:"COB_ID"`
GrossLoss float64 `json:"GrossLoss"`
}
type ResultData struct {
YearID int `json:"YearID"`
EventID int `json:"EventID"`
Modelcode int `json:"modelcode"`
Industry float64 `json:"Industry"`
LOB []LOBData `json:"y"`
}
db, err := sql.Open("sqlserver", ConnString())
checkErr(err)
defer db.Close()
var result string
err = db.QueryRow(`
SELECT i.YearID, i.EventID, i.modelcode, totalloss as Industry, y.COB_ID, y.GrossLoss
FROM dbo.CS_IndustryLossv8_7938 AS i INNER JOIN
dbo.Tb_YLT AS y ON i.YearID = y.YearID AND i.EventID = y.EventID AND i.modelcode = y.Modelcode
where YLT_DVID=25
FOR JSON AUTO`).Scan(&result)
fmt.Println(result)
YLT:= ResultData{}
//var YLT []ResultData
err=json.Unmarshal([]byte(result), &YLT)
checkErr(err)
fmt.Println(YLT)
}
fmt.Printlin(result) 打印:
[{"YearID":7687,"EventID":101900,"modelcode":41,"Industry":1.176648913256758e+010,"y":[{"COB_ID":5,"GrossLoss":6.729697615695682e+003}]},.....
但是 fmt.Println(YLT) 返回:
{0 0 0 0 []}
我收到“json 输入意外结束”的错误。
虽然 Go 没有字符串限制,但 MSSQL 有 8,000 个字符。如果我将查询限制在前 3 行并使用 var YLT []ResultData 它可以工作。无论如何要使用 MSSQL 和 Go 来做这件事,还是应该使用不同的服务器技术?
【问题讨论】:
-
这能回答你的问题吗? How to convert JSON string to struct
-
谢谢...导致问题的 MSSQL 字符串限制。不确定是否可以使用它,因为我想在哪里可以预加载相当大的数据集。
-
为什么不呢? : ``` err = db.QueryRow("你的查询").Scan(&result.YearID, &result.EventID, &result.Industry ...) ```
-
您的 JSON 是一个数组,但您将它解组为一个结构。看起来你有一部分结构被注释掉了,这将是解组到的正确类型。
-
是的,我编辑的 II 将其更改为结构的切片。想我在下面弄明白了。与 MSSQL 如何在其网格中显示结果与如何在记录集中返回数据有关。谢谢!
标签: sql-server go