我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

为什么 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 以字符串形式返回?的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

问题内容我已经启动了一个“instagram 克隆”后端来尝试学习有关 golang 的知识,但我遇到了一个不知道如何解决的问题。我用 fiber 构建了一个简单的 api,可以获取一些帖子:package serverimport
为什么 JSONB 以字符串形式返回?
2024-02-06

CreateProcess和CreatePipe在VC ++中执行进程并以字符串形式返回输出

以下是在VC ++中使用CreateProcess和CreatePipe执行进程并以字符串形式返回输出的示例代码:```cpp#include #include #include std::string ExecuteCommand(con
2023-09-27

php count字符串返回的是什么

本篇文章为大家展示了php count字符串返回的是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。php count字符串返回“1”。原因:count()是一个数组方法,可返回数组中元素的数目;
2023-06-29

Python怎么将字符串转换为大写或小写形式

Python中可以使用字符串的方法upper()和lower()来将字符串转换为大写和小写形式。示例代码:string = "Hello, World!"upper_string = string.upper()lower_stri
Python怎么将字符串转换为大写或小写形式
2024-03-02

如果搜索字符串不在 FIELD() 函数中作为参数提供的字符串列表中,MySQL 将返回什么?

假设如果搜索字符串不在FIELD()函数中作为参数提供的字符串列表中,那么MySQL将返回0作为输出。示例mysql> Select FIELD(Ram,New,Delhi);+----------------------------+
2023-10-22

php怎么将time()获取的值转为日期字符串形式

在php中,可以使用date()函数将time()返回的值转为日期字符串形式,语法“date("Y-m-d H:i:s",time())”。time()会返回代表当前时间的时间戳,而date()可以格式化时间戳,并返回已格式化的日期字符串。
2014-05-01

为什么 Python 中的 f-string 可以连接字符串与数字

这篇文章主要讲解了“为什么 Python 中的 f-string 可以连接字符串与数字”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么 Python 中的 f-string 可以连接字符
2023-06-15

python中内置函数ord()返回字符串的ASCII数值是什么

这篇文章主要介绍“python中内置函数ord()返回字符串的ASCII数值是什么”,在日常操作中,相信很多人在python中内置函数ord()返回字符串的ASCII数值是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希
2023-07-02

为什么可以Python中使用f-string 连接字符串与数字

本篇文章为大家展示了为什么可以Python中使用f-string 连接字符串与数字,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。下面以字符串和数字为例,看看强行操作会产生什么结果:>>> "Pyth
2023-06-06

如果要删除的字符数超过原始字符串中可用的字符数,MySQL INSERT() 函数会返回什么?

如果要删除的字符数超过原始字符串中可用的字符数,则 MySQL INSERT() 函数将继续删除字符,直到原始字符串末尾。示例mysql> Select INSERT(myteststring,3,15,original);+-------
2023-10-22

Java中将接口返回的字节串转为文件的方法是什么

本篇内容主要讲解“Java中将接口返回的字节串转为文件的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中将接口返回的字节串转为文件的方法是什么”吧!讲一下现在的需求场景最近公司
2023-06-25

如果我们在 LPAD() 或 RPAD() 函数中提供一个空字符串来填充其他字符串,MySQL 将返回什么?

假设如果我们在 LPAD() 或 RPAD() 函数上提供一个空字符串用于填充,那么 MySQL 将返回 NULL 作为输出。以下示例将演示它 -示例mysql> Select LPAD(ABCD,22,);+---------------
2023-10-22

c++11多种格式时间转化为字符串的实现方法是什么

c++11多种格式时间转化为字符串的实现方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.打印系统当前时间,或者将系统当前时间转化为字符串#include
2023-06-21

在日期和时间部分之间使用“T”或“空格”以外的任何其他字符时,MySQL 返回什么?

在这种情况下,MySQL 将返回时间处的全零以及正确的日期部分。如下所示,我们在日期和时间部分之间的“T”或“Space”位置使用字符“W” -mysql> Select TIMESTAMP(2017-10-20W06:10:36);+-
2023-10-22

如果原始字符串的长度大于 LPAD() 或 RPAD() 函数中指定的参数长度,MySQL 将返回什么?

在这种情况下,MySQL不会填充任何内容,并且会从原始字符串中截取字符,直到LPAD()或RPAD()函数中提供的长度值为止。示例mysql> Select LPAD(ABCD,3,*);+--------------------+|
2023-10-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录