如何强制fge json-schema验证器在未知关键字上抛出错误?

时间:2017-05-19 12:47:46

标签: java jsonschema json-schema-validator

我希望我的应用程序接收Json模式,然后验证某些JSON对象是否符合模式。我的问题是,如果我提供错误的Json模式,我不会得到异常,只是日志中的一些警告。 所以我要么被抛出异常,要么以某种方式考虑警告。但是,警告日志对我来说似乎相当沉默。

我正在使用java,而库是json-schema

的标准库
Log.i("TAG", "...")

3 个答案:

答案 0 :(得分:2)

JSON Schema的元模式("模式的模式")允许其他属性,因此fge验证器也可以,并且没有理由为什么实现会改变这个限制。

您可以做的一件事是下载元架构,将其更改为"additionalProperties": false,然后使用验证器加载此更改的元架构,并使用验证您自己的架构。

draft4元模式位于:http://json-schema.org/draft-04/schema

答案 1 :(得分:0)

我能够更改FGE验证器在提供未知属性时将验证视为不成功所需的错误阈值。以下代码完成了工作

void validateSchema(JsonNode schemaNode) throws JsonProcessingException {

  SyntaxValidator validator = JsonSchemaFactory.byDefault().getSyntaxValidator();

  ProcessingReport report = new ListProcessingReport(null, LogLevel.INFO);
  ValueHolder<SchemaTree> holder = ValueHolder.<SchemaTree>hold("schema",
      new CanonicalSchemaTree(SchemaKey.anonymousKey(), schemaNode));

  Processor<ValueHolder<SchemaTree>, ValueHolder<SchemaTree>> processor =
    validator.getProcessor();
  report = ProcessingResult.uncheckedResult(processor, report, holder).getReport();

  if (!report.isSuccess()) {
    IllegalArgumentException ex = new IllegalArgumentException();

    for (ProcessingMessage processingMessage : report) {
      ex.addSuppressed(processingMessage.asException());
    }

    throw ex;
  }
}

答案 2 :(得分:0)

好方法@ erosb,@ Llvanov。作为替代方案,我可以通过将“ additionalProperties”属性直接注入到模式节点中来使解析器验证未知属性。

((ObjectNode) schemaNode).put(
    "additionalProperties", 
    false);