Maison > développement back-end > Golang > le corps du texte

Pourquoi JSONB est-il renvoyé sous forme de chaîne ?

WBOY
Libérer: 2024-02-05 23:18:09
avant
709 Les gens l'ont consulté

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

Contenu de la question

J'ai démarré un backend "clone Instagram" pour essayer d'en apprendre davantage sur Golang, mais j'ai rencontré un problème que je ne sais pas comment résoudre.

J'ai construit une API simple en utilisant la fibre pour obtenir quelques publications :

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)
}
Copier après la connexion

Le problème est que l'attribut likes est renvoyé sous forme de chaîne :

[
    {
        "id": "...",
        "description": "...",
        "media": "...",
        "type": "...",
        "likes": "[]",
        "user_id": "...",
        "created_at": "...",
        "updated_at": "..."
    }
]
Copier après la connexion

J'ai essayé certaines choses comme utiliser json.marshal(data) et j'ai aussi écrit une structure like mais je n'ai pas pu la faire fonctionner car lorsque je mets json.marshal(data),我还写了 like 结构,但我无法使其工作,因为当我将 likes 的类型从 string 更改为 []like Le message suivant apparaît lors de l'appel de scan lorsque le type passe de 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
Copier après la connexion

J'utilise la base de données postgresql et j'essaie d'utiliser la colonne jsonb pour la première fois, donc jsonb 列,因此 likes 在数据库中是 jsonb dans la base de données, c'est la colonne jsonb.

Ma charge utile idéale ressemble à ceci :

[
    {
        "id": "...",
        "description": "...",
        "media": "...",
        "type": "...",
        "likes": [],
        "user_id": "...",
        "created_at": "...",
        "updated_at": "..."
    }
]
Copier après la connexion

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


正确答案


您很可能需要实现 sql.driver est désormais un tableau plutôt qu'une chaîne. Alors est-ce que quelqu'un sait comment résoudre ce problème ?

🎜

Bonne réponse

🎜🎜Vous devrez probablement implémenter l'interface de sql.driver pour "savoir" comment scanner votre structure, probablement quelque chose comme 🎜
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)
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!