Heim > Backend-Entwicklung > Golang > Warum wird JSONB als String zurückgegeben?

Warum wird JSONB als String zurückgegeben?

WBOY
Freigeben: 2024-02-05 23:18:09
nach vorne
745 Leute haben es durchsucht

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

Frageninhalt

Ich habe ein „Instagram-Klon“-Backend gestartet, um etwas über Golang zu lernen, bin aber auf ein Problem gestoßen, das ich nicht lösen kann.

Ich habe eine einfache API mit Glasfaser erstellt, um einige Beiträge zu erhalten:

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)
}
Nach dem Login kopieren

Das Problem besteht darin, dass das Attribut likes als Zeichenfolge zurückgegeben wird:

[
    {
        "id": "...",
        "description": "...",
        "media": "...",
        "type": "...",
        "likes": "[]",
        "user_id": "...",
        "created_at": "...",
        "updated_at": "..."
    }
]
Nach dem Login kopieren

Ich habe einige Dinge wie die Verwendung von json.marshal(data) ausprobiert und auch eine ähnliche-Struktur geschrieben, aber ich konnte es nicht zum Laufen bringen, weil beim Eingeben json.marshal(data),我还写了 like 结构,但我无法使其工作,因为当我将 likes 的类型从 string 更改为 []like die folgende Meldung angezeigt wird beim Aufruf von scan, wenn der Typ von string in []like geändert wird

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
Nach dem Login kopieren

Ich verwende eine Postgresql-Datenbank und versuche zum ersten Mal, die Spalte jsonb zu verwenden, also jsonb 列,因此 likes 在数据库中是 jsonb in der Datenbank ist es die Spalte jsonb.

Meine ideale Nutzlast sieht so aus:

[
    {
        "id": "...",
        "description": "...",
        "media": "...",
        "type": "...",
        "likes": [],
        "user_id": "...",
        "created_at": "...",
        "updated_at": "..."
    }
]
Nach dem Login kopieren

Beachten Sie, dass likes 现在是一个数组而不是字符串。那么有人知道如何解决这个问题吗?


正确答案


您很可能需要实现 sql.driver jetzt ein Array und kein String ist. Weiß jemand, wie man dieses Problem löst?

🎜

Richtige Antwort

🎜🎜Sie müssen wahrscheinlich die Schnittstelle von sql.driver implementieren, um zu „wissen“, wie Sie in Ihre Struktur scannen so etwas wie 🎜
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)
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum wird JSONB als String zurückgegeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage