在json模式定义中添加自定义约束和字段

问题描述 投票:0回答:2

您好,我试图了解如何使用 json 模式来验证每个软件层(数据库、模型和演示)的数据。

我已经基本了解了如何转换jsonschema定义中的记录;例如考虑:

{
    "$schema": "https://json-schema.org/draft/2020-12/schema"
  , "id":"myId"
  , "type":"object"
  , "properties":{
        "code":{"type":"string","pattern":"[a-zA-Z0-9]{6}-[0-9]{4}"}
    ,   "firstAmount":{"$ref": "#/$defs/amount"}
    ,   "secondAmount":{"$ref": "#/$defs/amount"}
    ,   "inputDate":{"$ref": "#/$defs/dateTime"}
  }
  , "required":["code","inputDate"]
  ,"dependentRequired":{"firstAmount":["secondAmount"]}
  ,"additionalProperties":false
  ,"$defs":{
    "amount":{"type":"integer", "minimum":1, "maximum":9999999}
   , "dateTime":{"type":"string", "format":"date"}
  }

此模式评估:

{
        "code":         "a89dff-5467"
    ,   "firstAmount":  98520
    ,   "secondAmount": 45678
    ,   "inputDate":    "2025-05-15"
    
}

我正在寻找一种方法(可能是正确的方法):

  • 添加一个约束,即:secondAmount 必须小于firstAmount
  • 为约束添加自定义错误消息
  • 为架构定义中的每个字段添加标签(以便 FE 可以显示此文本
  • 一般来说,添加模型层和表现层的指令
  • 还验证海关限制

如果我对前 4 点的理解正确的话,我所说的是添加自定义词汇表,但是如何添加呢?

对于最后一点,没有解决方案,因为我必须扩展我使用的验证器(doh!),这是正确的吗?

有什么建议吗?

jsonschema
2个回答
1
投票

我一次拿一个。

添加一个约束,即:secondAmount 必须小于firstAmount

JSON 架构不支持开箱即用。 无法根据另一个位置的值来定义一个位置的值。

也就是说,有一个扩展词汇表可以支持这一点,但据我所知,我的 .Net 实现是唯一的。

为约束添加自定义错误消息

自定义错误消息将基于您正在使用的实现(如果支持的话)。 没有办法在架构本身内定义错误消息。

为架构定义中的每个字段添加标签(以便 FE 可以显示此文本

JSON 模式(当前状态)将忽略未知关键字,许多实现会将它们作为注释返回。

JSON 模式的下一个版本将要求这些注释性关键字以

x-
开头(如果它们未在词汇表中定义),因此现在最好在您的自定义关键字前面添加前缀,以便它今后将兼容。

一般来说,添加模型层和表现层的指令

这也属于自定义注释关键字的类别,您可以根据需要将其添加到架构中。

还验证海关限制

这将取决于您使用的实现以及它们对自定义断言关键字的支持程度。 一些实现支持仅定义关键字并注册它,而其他实现则要求将关键字包含在词汇表中。

有关词汇表的更多信息,请查看我的文档,其中提供了概述,然后再深入了解我的实现是如何实现的。


0
投票

查看以下 GitHub 项目,它们尝试使用不同的方法解决自定义约束和依赖字段:

© www.soinside.com 2019 - 2024. All rights reserved.