【问题标题】:jsonschema error: Schema "schema-name/properties/hashes" already exists with different definitionsjsonschema 错误:模式“schema-name/properties/hashes”已经存在,但定义不同
【发布时间】:2021-09-03 21:52:28
【问题描述】:

我正在使用 jsonschema 对 json 文件进行验证。问题是当我尝试运行架构时出现以下错误:

Error:Schema <http://cyclonedx.org/schema/bom-1.3.schema.json#/properties/hashes> already exists with different definition.

但是,如果我使用在线验证器并运行架构,它说它是有效的。

我的代码如下所示:

const fs = require("fs");
var Validator = require('jsonschema').Validator;
var validator = new Validator();


const sbombJson = process.argv[3];
const testJson = process.argv[4];

const jsonSchemaValitaor =(schema,test) =>{

  console.log(validator.validate(test, schema).errors);

}


const sbombSchema =  JSON.parse(fs.readFileSync(sbombJson,'utf8'));
const test =  JSON.parse(fs.readFileSync(testJson,'utf8'));

jsonSchemaValitaor(sbombSchema,test);

我对 json 模式很陌生,所以如果这是一个超级简单的问题,我很抱歉,但我会 感谢您的帮助。

架构网址:https://cyclonedx.org/schema/bom-1.3.schema.json

【问题讨论】:

    标签: node.js json jsonschema json-schema-validator


    【解决方案1】:

    正如错误消息所说:您有多个带有"$id": "#/properties/hashes" 的子模式。在线验证器也应该将其检测为错误。

    FWIW,在 $id 中使用片段(“#”之后的内容)在所有情况下都是错误的,因此在线验证器也存在错误。您应该删除所有以“#”开头的“$id”标签,因为它们在规范中无效,并且没有任何用途。

    【讨论】:

    • 给定的模式是draft-07,所以只有片段的$id 是有效的,这是您定义命名锚的方式。但是,/ 字符不是锚点中的有效字符,因此那些 $ids 是无效的。无论如何定义一个看起来像 JSON 指针的命名锚是没有意义的,因此删除它们绝对是正确的做法。
    • 这个模式是那些自动生成的模式之一。这始终是标志。
    • @Relequestual 我希望我们可以阻止该工具这样做。 $ids 中的 json 指针片段从未有效。
    • “我希望我们能阻止那个工具这样做。”我在 repo 上创建了一个已被忽略的问题。如果有人想帮助他们解决这个问题,这里是类似的,github.com/jackwootton/json-schema/issues/112
    【解决方案2】:

    由于某种原因,您已经定义了两次"$id": "#/properties/hashes"

    看起来您从由工具生成的 JSON 模式复制了该子模式。生成这些模式的工具通常会为每个属性添加不需要的(实际上是无用的)$id

    删除这些定义应该可以防止错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 2018-06-14
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多