首頁 > 後端開發 > Golang > 為什麼 JSONB 以字串形式回傳?

為什麼 JSONB 以字串形式回傳?

WBOY
發布: 2024-02-05 23:18:09
轉載
739 人瀏覽過

为什么 JSONB 以字符串形式返回?

問題內容

我已經啟動了一個「instagram 克隆」後端來嘗試學習有關golang 的知識,但我遇到了一個不知道如何解決的問題。

我用 fiber 建立了一個簡單的 api,可以取得一些貼文:

package server

import (
    "fmt"
    "instagram/internal/psql"
    queries "instagram/internal/sql"
    "net/http"

    "github.com/gofiber/fiber/v2"
)

type like struct {
    username string
    name     string
    picture  string
}

type post struct {
    id          string `json:"id"`
    description string `json:"description"`
    media       string `json:"media"`
    type        string `json:"type"`
    likes       string `json:"likes"`
    user_id     string `json:"user_id"`
    created_at  string `json:"created_at"`
    updated_at  string `json:"updated_at"`
}

func listposts(c *fiber.ctx) error {
    rows, err := psql.db().query(queries.getallposts)

    if err != nil {
        c.sendstatus(400)
        return nil
    }

    defer rows.close()
    var data []post

    for rows.next() {
        var post post
        err := rows.scan(&post.id, &post.description, &post.media, &post.type, &post.created_at, &post.updated_at, &post.likes, &post.user_id)
        if err != nil {
            fmt.print(err)
            c.sendstatus(400)
            return nil
        }

        data = append(data, post)
    }

    return c.status(http.statusok).json(data)
}
登入後複製

問題是 likes 屬性作為字串傳回:

[
    {
        "id": "...",
        "description": "...",
        "media": "...",
        "type": "...",
        "likes": "[]",
        "user_id": "...",
        "created_at": "...",
        "updated_at": "..."
    }
]
登入後複製

我嘗試了一些東西,例如使用json.marshal(data),我還寫了like 結構,但我無法使其工作,因為當我將likes 的類型從string 更改為[]like 時在呼叫掃描時出現以下訊息

sql: scan error on column index 6, name "likes": unsupported scan, storing driver.value type []uint8 into type *[]server.likesql: scan error on column index 6, name "likes": unsupported scan, storing driver.value type []uint8 into type *[]server.like
登入後複製

我正在使用 postgresql 資料庫,並且我第一次嘗試使用 jsonb 列,因此 likes 在資料庫中是 jsonb 列。

我理想的有效負載是這樣的:

[
    {
        "id": "...",
        "description": "...",
        "media": "...",
        "type": "...",
        "likes": [],
        "user_id": "...",
        "created_at": "...",
        "updated_at": "..."
    }
]
登入後複製

請注意,likes 現在是一個陣列而不是字串。那麼有人知道如何解決這個問題嗎?


正確答案


您很可能需要實作sql.driver 的介面來「知道」如何掃描到您的結構,可能類似於

type Like struct {
    Username string
    Name     string
    picture  string
}

type Likes []Like

func (l Likes) Value() (driver.Value, error) {
    return json.Marshal(l)
}

// Make the Likes implement the sql.Scanner interface.
func (l *Likes) Scan(value interface{}) error {
    b, ok := value.([]byte)
    if !ok {
        return errors.New("type assertion to []byte failed")
    }

    return json.Unmarshal(b, &l)
}
登入後複製

以上是為什麼 JSONB 以字串形式回傳?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板