【问题标题】:Using ref in JSON Schema to refer to a local schema on disk在 JSON Schema 中使用 ref 来引用磁盘上的本地模式
【发布时间】:2018-05-06 17:17:44
【问题描述】:

我有一个 JSON 模式文件:

{  
   "id":"http://schema.acme.com/user",
   "$schema":"http://json-schema.org/draft-06/schema#",
   "definitions":{  
      "user":{  
         "description":"The name the user has selected",
         "type":"object",
         "required":[  
            "username",
            "premium"
         ],
         "properties":{  
            "username":{  
               "type":"string",
               "maxLength":10,
               "minLength":1
            },
            "premium":{  
               "type":"boolean"
            }
         }
      }
   }
}

我想根据一个 json 对象来验证它。所以我用这个模式创建了一个该类型的临时对象:

{  
   "id":"http://schema.acme.com/uName",
   "$schema":"http://json-schema.org/draft-06/schema#",
   "properties":{  
      "uName":{  
         "$ref":"smUserSchema.json#/definitions/user"
      }
   },
   "required":[  
      "uName"
   ]
}

我有这个 JSON 数据文件:

{  
   "uName":{  
      "username":"Bob",
      "premium":true
   }
}

这里的目标是不要将我的临时对象嵌入到类类型的 JSON 架构中。 (是的,我的一个问题是我正在尝试将 OO 技术应用于 JSON。这是真的,我这样做只是出于重用和继承的原因,可能有更好的方法。)

当我去验证这个时,我得到了这个错误:

$ ajv -s uNameSchema.json -d validUser.json 
schema uNameSchema.json is invalid
error: can't resolve reference smUserSchema.json#/definitions/user from id http://schema.acme.com/uName#

如何将 JSON 架构包含在另一个架构中?

另见:

【问题讨论】:

    标签: jsonschema ajv


    【解决方案1】:

    您需要确保 ajv 知道smUserSchema.json,它不会自动找到它。有一个命令行选项可以传递依赖模式,但我不记得它了。 ajv --help 应该会告诉你(我没有现成的)。

    【讨论】:

    • 我以为 JSON Schema 规范说引用的 schema 会在 schema 的目录中搜索?此外,ajv 似乎没有搜索路径。我认为您正在考虑具有这种能力的 ajv 库。 (我想!哈哈)
    • 我错了。 “帮助”没有提到它,但网站确实谈到了“-r - 引用模式”选项。
    • 嗯,没用,而且很有希望! // $ ajv -s uNameSchema.json -d validUser.json -r usernameSchema.json // 模式 uNameSchema.json 无效 // 错误:无法解析来自 id schema.acme.com/uName#
    • 这绝对是一个实现使用问题,所以我建议在 ajv 或 ajv-cli 存储库中询问,或者用 ajv 标记这个问题,因为我知道 ajv 开发人员会在这里回答问题。跨度>
    【解决方案2】:

    您已将要引用的架构的$id 设置为http://schema.acme.com/user

    但是,您使用smUserSchema.json#/definitions/user 的相对引用,它解析为http://schema.acme.com/smUserSchema.json#/definitions/user

    您需要更改您引用的架构中定义的$id,或用于$ref 的相对URI,以便它们匹配。

    我意识到这个答案有点晚了,我希望你在现在之前解决了你的问题,但它可能对其他人仍然有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-09
      • 1970-01-01
      • 2020-11-17
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      相关资源
      最近更新 更多