【问题标题】:JSON schema validation of optional fields using Golang使用 Golang 对可选字段进行 JSON 模式验证
【发布时间】:2023-03-23 19:32:01
【问题描述】:

Golang JSON 架构验证库验证架构上的必填字段是否存在于服务请求/响应中。

我需要验证服务请求或响应中的任何字段都必须是架构上的属性。如果有效负载中的属性在架构中不存在,则验证应该失败。

例如:GET 响应:

{
   "pet": "dog",
   "name": "Scooby",
   "licence": "123-123"
}

在我的示例 JSON 架构中,没有任何字段是必需的。但是,如果我在服务中将字段“pet”更改为“petBreed”,JSON 模式验证器(例如 https://github.com/xeipuuv/gojsonschema)将不会捕获它。

将所有字段都设为必填不是一种选择。谁能推荐一个 Go 中的库:

  1. 验证所有响应字段都在架构中
  2. 如果架构中的字段不在响应中,则不会失败

【问题讨论】:

  • 如果我了解您,您想知道 JSON 有效负载是否包含您架构中未定义的其他字段,对吗?
  • 是的。如果负载中存在未由架构定义的额外字段,我需要验证失败,例如:拼写错误,当我们更改 JSON 响应负载时没有更新架构。
  • 解组到例如map[string]interface{} 并检查键。非常简单,不需要任何工具。
  • 是的,我可能会接受沃尔克的提议。也许您可以找到一个可以为您提供 JSON 模式的所有字段的库,并将这些字段与未编组到映射的有效负载的字段进行比较。
  • 虽然操作简单,但当它已经支持 information loss 的一种形式时,在外部检查 JSON 模式。

标签: json validation go optional


【解决方案1】:

JSON Schema 为此目的定义了additionalProperties,类似这种模式的东西应该可以工作:

{
    "type": "object",
    "additionalProperties": false,
    "properties":{
        "pet": ...,
        "name": ...,
        "license": ...,
    },
}

这是implemented,但未在gojsonschema 中记录。

请注意,additionalProperties 是一个架构,而不仅仅是一个布尔值,也就是说,您可以对未知属性进行任意验证,而不仅仅是禁止它们。

【讨论】:

  • 谢谢。这是最有用的解决方案,而且实施起来也最简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 2021-06-16
  • 2016-10-05
  • 1970-01-01
相关资源
最近更新 更多