java - 如何将默认值从 JSON 模式添加到 Java 中的 JSON 文档
问题描述
如果给定文档中缺少值,我需要验证 JSON 文档并添加架构中定义的默认值。我正在使用networknt/json-schema-validator进行验证,但我不确定如何添加默认值。有没有办法使用上面的库或其他可以让我这样做的工具来做到这一点?
解决方案
在 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”属性缺失。然后,您可以编写一个简短的脚本来合并任何缺失的属性。
有关 JSON Schema 问题跟踪器中的类似内容,请参阅https://github.com/json-schema-org/json-schema-spec/issues/858。
推荐阅读
- mysql - SQL中分区上的字符串连接?
- system-verilog - 如果测试台和测试是顶级模块,如何将测试台内的接口实例传递给测试
- php - 如何使用 $set 中的会话变量设置字段以更新 PHP 中的单个 MongoDB 文档
- jquery - 为什么当我打开我的模式时没有触发 .focus() ?
- python - 使用 Python Web Scraper 过滤网页上字符串后面的数字
- c# - 是否可以将存储过程映射到 EF Core 中的实体?
- c++ - 如何使 std::getline() 包含最后一个空行?
- angular - 在 Angular/Formly 中过滤数组
- vega-lite - Vega-Lite 图表 x 轴显示不显示新年开始后的月份
- python - 我应该如何/使用什么数据库将可查询列表存储在数据库中?链接表似乎非常过度和缓慢?