当前位置: 首页 > 面试题库 >

前往:JSON封送错误

严子默
2023-03-14
问题内容

我正在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接口:

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没有检测到错误接口,并且大多数错误类型都没有导出的字段,因此反射无法显示这些字段。



 类似资料:
  • 我可以找到许多例子,说明如何让akka-http服务器轻松封送由case类表示的响应实体,只需混合使用SprayJSONSupport/DefaultJSONProtocol,在隐式作用域中提供jsonFormat并在路由DSL中使用complete指令。整齐!

  • null 杰克逊在默认情况下有能力做到这一点。

  • 我从遵循以下模式的 API 接收动态 JSON: 例如,原始数据将是: 考虑到我们想避免解组到这样的结构: 我们将不得不像这样将数据投回: 解组的更好方法是什么?

  • 问题内容: 我正在尝试找到一种方法来以最少的工作量完成xsd模式到数据存储往返。 我使用jaxb从架构中构建对象模型,现在我想基于JPA(或JDO或其他东西?)存储这些对象。是否有可能基于JAXB注释自动增强缺少注释的对象?是可取的吗? 谢谢 问题答案: 对于此用例,您有几种选择。 选项#1-Hyperjaxb3 我自己没有使用过,但是Hyperjaxb3应该在模型上生成JAXB和JPA批注: h

  • 我正在开发一个客户端来使用 Web 服务,但由于某种原因,除非所有命名空间都正确且没有任何前缀,否则我的请求没有得到正确处理。 我所有的类都是由服务提供商使用提供的XSD和WSDL创建的。 NfeDadosMsg.class 包装信息.java TConsStatServ.class package br.inf.portalfiscal.nfe; 包装信息.java 输出xml: 由于某种原因,

  • 我正在尝试使用JAXB进行封送处理。 我的输出是这样的: ...但我需要这样的输出: 如果取消对代码的注释,则会得到。没有它,我可以编译,但我不能得到所需的精确输出。 我的豆子长这样: 适配器类