我对JSON模式很陌生,所以请容忍我。我的目标是拥有一个作为对象的JSON属性。它的键相互关联,这意味着多个键总是有相同的值在一起。这可能有助于清楚地表明,这是我试图用一个enum来实现的:
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"title": "Part",
"type": "object",
"properties": {
"relationship": {
"type": "object",
"enum": [
{
"code": "1",
"value": "MEMBER"
},
{
"code": "2",
"value": "SPOUSE"
},
{
"code": "3",
"value": "CHILD"
},
{
"code": "4",
"value": "STUDENT"
},
{
"code": "5",
"value": "DISABILITY_DEPENDENT"
},
{
"code": "6",
"value": "ADULT_DEPENDENT"
},
{
"code": "8",
"value": "DOMESTIC_PARTNER"
}
]
}
}
}因此,使用像这样的枚举是有效的,尽管我在JSON模式规范中找不到它。但是,错误信息很糟糕。通常,我从模式验证中得到非常详细的错误消息,但是在这种情况下,我没有。
$.part.relationship: does not have a value in the enumeration [, , , , , , ]我不知道我做错了什么。我正在为JSON模式使用Java解析器:
<dependency>
<groupId>com.networknt</groupId>
<artifactId>json-schema-validator</artifactId>
<version>1.0.53</version>
</dependency>不确定错误消息是解析器的错误还是我对模式做得不好。我会感谢你的帮助。
发布于 2021-05-20 19:22:49
这对我来说是个新闻,但根据规格似乎确实认为对象是有效的枚举值。尽管如此,你的用法还是很不寻常的。我从没见过它用过。
六种基本类型(“空”、“布尔”、“对象”、“数组”、“数字”或“字符串”). 6.1.2.枚举 ..。 数组中的元素可能是任何类型的,包括null。
从根本上讲,您使用的库不知道如何将这些对象转换为可打印的字符串。即使它确实给了它一个合理的机会,你可能最终会
does not have a value in the enumeration [{"code": "1", "value":"MEMBER"}, {"code": "2" ...也许可以,但也不算什么了不起的事。如果代码和值都是有效的,但不匹配,那么在发现问题之前,您可能必须仔细查看列表。
一般来说,JSON模式并不擅长在它认为是两个不相关的字段之间强制执行约束。这超出了它的范围,它的目标是。它试图验证这个结构。字段之间的依赖关系是业务约束,而不是结构约束。
我认为,要实现可读的错误消息,最好的方法是有两个子属性,每个属性包含8个值;一个用于代码,一个用于值。
然后你就会得到
$.part.relationship.code does not have a value in the enumeration [1,2,3,4 ...或
$.part.relationship.value does not have a value in the enumeration ["MEMBER", "SPOUSE", ...如果强制执行该约束对您很重要,您可以在模式验证的基础上进行一些额外的业务验证。然后生成您自己的错误,例如
code "1" does not match value "SPOUSE"发布于 2021-05-25 23:42:07
如果code和value的值总是相对相同的,那么为什么在JSON中都编码呢?只需在JSON中编码一个值,并在应用程序中推断另一个值。
这将更容易验证。
https://stackoverflow.com/questions/67626506
复制相似问题