【问题标题】:How to add default values from JSON schema to JSON document in Java如何将默认值从 JSON 模式添加到 Java 中的 JSON 文档
【发布时间】:2020-02-27 12:51:15
【问题描述】:

如果给定文档中缺少值,我需要验证 JSON 文档并添加架构中定义的默认值。我正在使用networknt/json-schema-validator 进行验证,但我不确定如何添加默认值。有没有办法使用上面的库或其他可以让我这样做的工具来做到这一点?

【问题讨论】:

  • 在我看来,JSON Schema 没有定义默认值的业务,因此缺乏明确的实现。模式只是具有通过/失败结果的数据检查,它不应该处理数据更改的概念。对于理想的解决方案架构,我会完全避免依赖 JSON Schema 默认值;这些应该在另一层上定义,因为相关(例如存储、API 等)

标签: java json jsonschema json-schema-validator


【解决方案1】:

在 JSON Schema 中没有明确定义的方法。


虽然 JSON Schema 中有一个“default”关键字,但它主要用于 用户界面 使用,以提供默认初始值。考虑架构:

{ "type":"string", "minLength":1, "default":"" }

在这种情况下,意思是“当我创建这个模式的一个实例时,给它一个空字符串的初始值。”

首先,请注意此默认文档仍然无效——它必须由用户更改才能生效。 “默认”只需要格式良好的 JSON。提供它是因为在这种情况下,空字符串比空文档(这将是无效的 JSON)更好的默认值。

其次,JSON Schema 不假定未定义的值与提供的默认值相同。允许使用默认值填充未定义的属性以更改实例的含义。例如,给定这个架构:

{ "properties":
    "port": { "type":"number", "default": 80 }
}

未定义的属性可能意味着一件事,但一旦我创建了该属性,它应该默认为 80。

第三,“默认”关键字甚至不适用,除非实例存在以便可以考虑该关键字。如果您尝试在对象中填充属性,为了让 JSON 模式验证器“看到”“默认”关键字,它必须首先将实例应用于具有此类关键字的模式。

使用上面的模式,如果你有一个像{} 这样的实例,验证器甚至不会遇到“默认”关键字,因为该实例没有“端口”属性来加载包含它的子模式。


我不知道有一个库可以像你描述的那样做任何事情。

但是如果你想写一个,我建议你写一个这样的模式:

{
  "default": {
    "port": 80
  },
  "properties": {
    "port": { "type":"integer" }
  }
}

这将使验证器可以访问“default”关键字的值,即使“port”属性缺失。然后,您可以编写一个简短的脚本来合并任何缺失的属性。

请参阅https://github.com/json-schema-org/json-schema-spec/issues/858,了解 JSON Schema 问题跟踪器中的类似内容。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 2015-02-07
  • 2021-12-07
  • 2017-10-19
  • 1970-01-01
  • 2021-01-17
  • 2022-01-21
相关资源
最近更新 更多