JSON架构-对象枚举

zpf6vheq  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(167)

我是JSON Schema的新手。我的目标是有一个JSON属性是一个对象。它的键彼此相关,这意味着多个键总是具有相同的值。这可能有助于澄清这一点,这是我尝试使用枚举来做到这一点:

{
  "$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 Schema规范中找不到它。但是,错误消息糟透了。通常我会从模式验证中得到最详细的错误消息,但是在本例中我没有。

$.part.relationship: does not have a value in the enumeration [, , , , , , ]

我不知道我做错了什么。我正在使用JSON Schema的Java解析器:

<dependency>
    <groupId>com.networknt</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>1.0.53</version>
</dependency>

不确定错误消息是解析器的错误还是我对模式做得不好。

aoyhnmkz

aoyhnmkz1#

这对我来说是新闻,但according to the spec似乎对象是有效的枚举值。也就是说,你的用法很不寻常。我以前没见过它用过。
六个基本类型(“null”、“boolean”、“object”、“array”、“number”或“string”)……

6.1.2. enum...

数组中的元素可以是任何类型,包括null。
你的问题根本上是你使用的库不知道如何将这些对象转换成可打印的字符串。即使它确实给予了它一个合理的去,你可能最终与

does not have a value in the enumeration [{"code": "1", "value":"MEMBER"}, {"code": "2" ...

这也许没什么但也不算太好如果代码和值都是有效的,但不匹配,您可能必须非常仔细地查看列表才能发现问题。
JSON Schema通常不擅长在它认为是两个不相关的字段之间强制约束。这超出了它的目标范围。它试图验证这个结构。字段之间的依赖关系是业务约束,而不是结构约束。
我认为要获得可读的错误消息,最好的方法是使用2个子属性,每个子属性都有一个包含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"
dced5bon

dced5bon2#

如果codevalue总是具有相同的值,为什么要在JSON中编码两者?只需在JSON中编码一个值,并在应用程序中推断另一个值。
这将更容易验证。

相关问题