Go:JSON 封送错误

2024-03-23

我正在 Go 中构建 JSON API,我想以 json 形式返回错误响应。

响应示例:

{
    "error": "Invalid request syntax"
}

我认为我可以创建一个实现错误接口的包装结构,然后使用 Go 的 json 封送拆收器作为获取错误的 json 表示的干净方法:

type JsonErr struct {
    Err error `json:"error"`
}
func (t JsonErr) Error() string {
    return t.Err.Error()
}

这只会将 JsonErr 编组为{"error":{}},有没有办法使用默认的 Go json 封送拆收器来编码此结构,或者我是否需要为 JsonErr 结构编写一个快速的自定义 MarshalJson ?


只需实施json.Marshaler http://golang.org/pkg/encoding/json/#Marshaler界面:

func main() {
    var err error = JsonErr{errors.New("expected")}
    json.NewEncoder(os.Stdout).Encode(err)
}

type JsonErr struct {
    error
}

func (t JsonErr) MarshalJSON() ([]byte, error) {
    return []byte(`{"error": "` + t.Error() + `"}`), nil
}

它不起作用的原因是因为json.Marshal没有对错误接口的检测,并且大多数错误类型没有导出字段,因此反射无法显示这些字段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go:JSON 封送错误 的相关文章

  • 将绝对路径和相对路径组合起来得到新的绝对路径

    我正在编写一个程序 其中一个组件必须能够采用给定的路径 例如 help index html or help 和基于该位置的相对路径 例如 otherpage index html or sub dir of help or help2 h
  • 在 Go 中修改导入的库

    我的问题 弹性节拍 https www elastic co products beats是一个用 Go 编写的日志传送程序的开源项目 它具有多种日志输出功能 包括控制台 Elasticsearch 和 Redis 我想将我自己的输出添加到
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • Go 中的切片分块

    我有一个切片 其中包含约 210 万条日志字符串 我想创建一个切片切片 其中字符串尽可能均匀分布 这是我到目前为止所拥有的 logs is a slice with 2 1 million strings in it var divided
  • 有没有一种方法可以在不停机的情况下更新 net/http 服务器中的 TLS 证书?

    我有一个简单的 https 服务器 提供一个简单的页面 如下所示 为简洁起见 没有错误处理 package main import crypto tls fmt net http func main mux http NewServeMux
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • 在 Go 中使用互斥锁

    我想了解互斥体是如何工作的 据我目前的理解 它是为了进行原子操作并同步对某些数据的访问 我在这里构建了一个队列数据结构的示例 https github com arnauddri algorithms blob master data st
  • 当涉及多个渠道时,select 如何工作?

    我发现在多个非缓冲通道上使用 select 时 例如 select case lt chana case lt chanb 即使两个通道都有数据 但在处理此选择时 case chana 和 case chanb 的跟注不平衡 package
  • 如何在 Go 应用程序中处理打开/关闭数据库连接?

    我的 Web API 应用程序中有一组函数 他们对 Postgres 数据库中的数据执行一些操作 func CreateUser db err sql Open postgres user postgres password passwor
  • GAE Go — 如何对不存在的实体键使用 GetMulti?

    我发现自己需要做一个GetMulti使用键数组进行操作 其中某些实体存在 但有些实体不存在 我当前的代码 如下 返回错误 datastore no such entity err datastore GetMulti c keys info
  • 有没有办法在 VSCode 中保存时运行 go 测试,并将其输出到终端?

    现在我有几个项目在VSCode中运行 运行起来相当繁琐go test每次我编写新代码时 我宁愿立即看看我是否破坏了某些东西 我知道在 Javascript 中我可以在每次保存文件时运行测试 并将输出发送到终端 现在我正在使用 保存时运行 h
  • 我怎么知道我的所有 goroutine 确实正在使用 golang 的同步包等待一个条件

    我有一个应用程序 我正在创建多个 goroutine 来同时执行某个任务 所有工作协程都会等待条件 事件发生 一旦事件被触发 它们就会开始执行 创建完所有goroutines后 主线程在发送广播信号之前应该知道所有goroutines确实处
  • 如何将UTC时间转换为unix时间戳

    我正在寻找将 UTC 时间字符串转换为 unix 时间戳的选项 我的字符串变量是02 28 2016 10 03 46 PM并且需要将其转换为 unix 时间戳 例如1456693426 知道该怎么做吗 首先 unix时间戳14566934
  • Golang 正则表达式命名组和子匹配

    我正在尝试匹配正则表达式并获取匹配的捕获组名称 当正则表达式仅与字符串匹配一次时 这是有效的 但如果它与字符串匹配多次 SubexpNames不返回重复的名称 这是一个例子 package main import fmt regexp fu
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 打印到 stdout 会导致阻塞的 goroutine 运行吗?

    作为一个愚蠢的基本线程练习 我一直在尝试实现理发师睡觉的问题 http en wikipedia org wiki Sleeping barber problem在戈兰 对于通道来说 这应该很容易 但我遇到了一个 heisenbug 也就是
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • 为什么 json.Unmarshal 返回映射而不是预期的结构?

    看看这个游乐场 http play golang org p dWku6SPqj5 http play golang org p dWku6SPqj5 基本上 我正在工作的图书馆收到了interface 作为参数 然后需要json Unma
  • 直接从一个通道发送到另一个通道

    当从一个通道直接发送到另一个通道时 我偶然发现了令人惊讶的行为 package main import fmt func main my chan make chan string chan of chans make chan chan

随机推荐

  • 如何在 MacOS Sierra 上安装 pymssql

    Command usr bin python u c import setuptools tokenize file private tmp pip build J1I0ox pymssql setup py f getattr token
  • IEnumerator 移回记录

    我有一个要求 我必须有记录来回 所以我使用 IEnumerator 来实现这一点 但我可以通过 movenext 前进 但无法后退 这是一种可以包装的方法IEnumerator
  • Rails,在form_for标签自定义文本中插入span标签

    我的问题是我想插入一个 span tag in form for label自定义文本 在正常的 html 代码中 它会是这样的 span
  • FBSDKGraphRequest 使用未声明的标识符

    虽然我已经导入了 FacebookSDK 例如 import
  • 403 - 禁止:访问被拒绝。 ASP.Net MVC [重复]

    这个问题在这里已经有答案了 可能的重复 IIS 7 中的 ASP MVC 导致 HTTP 错误 403 14 禁止 https stackoverflow com questions 1741439 asp mvc in iis 7 res
  • 用 INSERT / UPDATE 的单个查询替换循环

    我正在 PostgreSQL 中编写一个函数 它基本上执行 3 个步骤 从源表中获取一条记录 检查目标表中提取的记录的值 如果在目标表中找到记录 则使用提取的记录更新目标表的所有值 否则将提取的记录插入目标表 如果我写 而不是做这个循环单一
  • 防止多次点击按钮

    我有以下 jQuery 代码来防止双击按钮 效果很好 我在用Page ClientValidate 确保仅当页面有效时才阻止双击 如果存在验证错误 则不应设置标志 因为没有启动到服务器的回发 有没有更好的方法来防止在页面加载回来之前第二次单
  • 无法创建新的 Chrome 远程会话

    我正在尝试使用 Selenium Grid 启动新的 Chrome 浏览器 但最终出现以下错误 无法创建新的远程会话 所需功能 功能 browserName chrome version 55 0 2 platform WINDOWS 所需
  • 如何重命名 Excel 工作表?

    我有一个场景 我想更改电子表格中工作表的名称 我尝试使用创建电子表格ss Workbook 我认为这是用名为 Sheet 的工作表创建电子表格 我尝试使用以下格式更改工作表的名称 ss sheet ss get sheet by name
  • Realm 将数据追加到类型 List

    我正在尝试遍历数据并将其保存在我的模型中 但是无论我做什么 我都会收到以下错误 Can t mutate a persisted array outside of a write transaction 我究竟做错了什么 我将每场比赛附加到
  • “文本”和 new String(“文本”) 有什么区别?

    下面这两个陈述有什么区别 String s text String s new String text new String text 显式创建一个新的且引用不同的实例String目的 String s text 可以重用来自的实例字符串常
  • Coldfusion autosuggest 不适用于字符串中间的建议

    对于我的自动建议 我使用下面的代码 输入时 它只查看字符串的开头 例如 如果我输入 abcd 它会附带建议 abcde 这很好 但它没有做什么 如果我输入 def 并且在数据库中我有一个字符串 abcdefg 那么它不会出现在自动建议中 在
  • 在 CellTable 中添加并排序的行

    我想在添加新行时对 CellTable 中的行进行排序 为了标记 UI 我使用 UIBinder
  • 如何在浏览器中读取本地文本文件?

    我试图通过创建一个函数来实现一个简单的文本文件阅读器 该函数接受文件的路径并将每行文本转换为字符数组 但它不起作用 function readTextFile var rawFile new XMLHttpRequest rawFile o
  • 在 php 中,我应该在通常返回数组的方法中返回 false、null 或空数组吗?

    我发现了一些对此的回应 但没有一个与 PHP 这是一种极其弱类型的语言 有关 关于PHP 在通常会返回数组但发生失败的方法中返回 false null 或空数组是否合适 换句话说 如果另一个开发人员加入我的项目 他们会期望看到什么 数组是事
  • 更新以前的会话数组 Laravel

    我有一个问题 如何更新我以前的数组 我的代码目前发生的情况是它只是添加新的会话数组 而不是更新声明的密钥 这是我的代码 foreach items updated as key gt added if id added item id ne
  • Mat-table 的行具有不同的子行数

    尝试使用mat table指令 例如 matRowDef and multiTemplateDataRows构建一个表 其中每行可以有不同数量的子行 示例界面如下所示 interface ReportCard student string
  • Android:标题栏和 ActionBar 有什么区别

    我无法判断它们是否是同一件事 而且它们似乎有不同的方法来删除它们 但我不确定这些是否只是做同一件事的多种方法 那么有区别吗 如果有区别的话是什么 Ref https developer android com reference andro
  • 捕获粘贴输入

    我正在寻找一种方法来清理粘贴到浏览器中的输入 这可以用 jQuery 实现吗 到目前为止我已经想出了这个 this live pasteEventName function e this is where i would like to s
  • Go:JSON 封送错误

    我正在 Go 中构建 JSON API 我想以 json 形式返回错误响应 响应示例 error Invalid request syntax 我认为我可以创建一个实现错误接口的包装结构 然后使用 Go 的 json 封送拆收器作为获取错误