首页 > 解决方案 > 如何将默认值从 JSON 模式添加到 Java 中的 JSON 文档

问题描述

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

标签: javajsonjsonschemajson-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


推荐阅读