Golang从postgres获取原始json

Golang从postgres获取原始json,json,postgresql,go,Json,Postgresql,Go,我的postrgres数据库中有存储过程 SELECT *FROM get_products() wich返回json [ { "id": 1, "name": "one", "addition": "spec1", "size": "", "category_id": 1, "vendor_id": 1 }, { "id": 2, "name": "two", "addition": "spec2",

我的postrgres数据库中有存储过程

SELECT *FROM get_products()
wich返回json

[
  {
    "id": 1,
    "name": "one",
    "addition": "spec1",
    "size": "",
    "category_id": 1,
    "vendor_id": 1
  },
  {
    "id": 2,
    "name": "two",
    "addition": "spec2",
    "size": "",
    "category_id": 1,
    "vendor_id": 1
  },

/// ...
]
由于json中可能存在未知数量的字段,如何在不生成结构的情况下返回过程的结果

我有这个密码。当过程返回表而不是json时,它工作得很好

func (s ProductController) GetAll(c *gin.Context) {

    db, err := sql.Open("postgres", "host=localhost dbname=postgres sslmode=disable user=postgres")

    rows, err := db.Query("SELECT *FROM get_products()")
    if err != nil {
        panic(err)
    }
    cols, err := rows.Columns()
    if err != nil {
        panic(err)
    }

    allgeneric := make([]map[string]interface{}, 0)
    colvals := make([]interface{}, len(cols))
    for rows.Next() {
        colassoc := make(map[string]interface{}, len(cols))
        for i, _ := range colvals {
            colvals[i] = new(interface{})
        }
        if err := rows.Scan(colvals...); err != nil {
            panic(err)
        }
        for i, col := range cols {
            colassoc[col] = *colvals[i].(*interface{})
        }
        allgeneric = append(allgeneric, colassoc)
    }

    err2 := rows.Close()
    if err2 !=nil {
        panic(err2)
    }

    fmt.Println(allgeneric)

    c.JSON(200, allgeneric)
}
它返回类似这样的结果

[
    {
        "get_products": "W3siaWQiOjEsIm5hbWUiOiJHMTciLCJhZGRpdGlvbiI6IiIsInNpemUiOiJTdGFuZGFyZCIsImNhdGVnb3J5X2lkIjoxLCJ2ZW5kb3JfaWQiOjF9LCB7ImlkIjoyLCJuYW1lIjoiRzE3IiwiYWRkaXRpb24iOiJHZW40Iiwic2l6ZSI6IlN0YW5kYXJkIiwiY2F0ZWdvcnlfaWQiOjEsInZlbmRvcl9pZCI6MX0sIHsiaWQiOjMsIm5hbWUiOiJHMTciLCJhZGRpdGlvbiI6IkdlbjQgIiwic2l6ZSI6IlN0YW5kYXJkIiwiY2F0ZWdvcnlfaWQiOjEsInZlbmRvcl9pZCI6MX0sIHsiaWQiOjQsIm5hbWUiOiJHMTdDIiwiYWRkaXRpb24iOiJHZW40Iiwic2l6ZSI6IlN0YW5kYXJkIiwiY2F0ZWdvcnlfaWQiOjEsInZlbmRvcl9pZCI6MX0sIHsiaWQiOjUsIm5hbWUiOiJHMTciLCJhZGRpdGlvbiI6IkdlbjUiLCJzaXplIjoiU3
但我需要返回上面指定的json

更新

将我的代码修改为

func (s ProductController) GetAll(c *gin.Context) {

    db, err := sql.Open("postgres", "host=localhost dbname=postgres sslmode=disable user=postgres")

    rows, err := db.Query("SELECT *FROM get_products()")
    if err != nil {
        panic(err)
    }

    var result []interface{}

    cols, _ := rows.Columns()
    pointers := make([]interface{}, len(cols))
    container := make([]json.RawMessage, len(cols))
    for i, _ := range pointers {
        pointers[i] = &container[i]
    }
    for rows.Next() {
        rows.Scan(pointers...)
        result = append(result, container)
    }

    fmt.Println(container)

    c.JSON(200, container)
}
现在它回来了

[
  [
    {
      "id": 1,
      "name": "one",
      "addition": "spec1",
      "size": "",
      "category_id": 1,
      "vendor_id": 1
    },
    {
      "id": 2,
      "name": "two",
      "addition": "spec2",
      "size": "",
      "category_id": 1,
      "vendor_id": 1
    },
  ]
]

需要删除此内部数组

查询返回一行,其中一列包含JSON。使用此代码读取单个值

row, err := db.QueryRow("SELECT *FROM get_products()")
if err != nil {
    // handle error
}
var jsonData []byte
if err := row.Scan(&jsonData); err != nil {
        // handle error
}
c.Data(200, "application/json", jsonData)

无需对JSON进行解码和编码。按原样使用从数据库返回的JSON数据。

查询返回一行,其中一列包含JSON。使用此代码读取单个值

row, err := db.QueryRow("SELECT *FROM get_products()")
if err != nil {
    // handle error
}
var jsonData []byte
if err := row.Scan(&jsonData); err != nil {
        // handle error
}
c.Data(200, "application/json", jsonData)

无需对JSON进行解码和编码。按原样使用从数据库返回的JSON数据。

modified my codemodified my coderow:=db.QueryRow(“SELECT*FROM get_products()”)刚刚更正了这一行,一切正常。非常感谢你的比赛!最后一个问题是,如何正确地将args传递给存储过程,它有两个args-category_id[]和vendor_id[]?行:=db.QueryRow(“SELECT*FROM get_products()”)刚刚更正了这一行,所有操作都正常。非常感谢你的比赛!最后一个问题是,如何正确地将参数传递给存储过程,它有两个参数-category_id[]和vendor_id[]?