首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSON模式-对象的Enum

JSON模式-对象的Enum
EN

Stack Overflow用户
提问于 2021-05-20 18:58:41
回答 2查看 4K关注 0票数 0

我对JSON模式很陌生,所以请容忍我。我的目标是拥有一个作为对象的JSON属性。它的键相互关联,这意味着多个键总是有相同的值在一起。这可能有助于清楚地表明,这是我试图用一个enum来实现的:

代码语言:javascript
复制
{
  "$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模式规范中找不到它。但是,错误信息很糟糕。通常,我从模式验证中得到非常详细的错误消息,但是在这种情况下,我没有。

代码语言:javascript
复制
$.part.relationship: does not have a value in the enumeration [, , , , , , ]

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

代码语言:javascript
复制
<dependency>
    <groupId>com.networknt</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>1.0.53</version>
</dependency>

不确定错误消息是解析器的错误还是我对模式做得不好。我会感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-20 19:22:49

这对我来说是个新闻,但根据规格似乎确实认为对象是有效的枚举值。尽管如此,你的用法还是很不寻常的。我从没见过它用过。

六种基本类型(“空”、“布尔”、“对象”、“数组”、“数字”或“字符串”). 6.1.2.枚举 ..。 数组中的元素可能是任何类型的,包括null。

从根本上讲,您使用的库不知道如何将这些对象转换为可打印的字符串。即使它确实给了它一个合理的机会,你可能最终会

代码语言:javascript
复制
does not have a value in the enumeration [{"code": "1", "value":"MEMBER"}, {"code": "2" ...

也许可以,但也不算什么了不起的事。如果代码和值都是有效的,但不匹配,那么在发现问题之前,您可能必须仔细查看列表。

一般来说,JSON模式并不擅长在它认为是两个不相关的字段之间强制执行约束。这超出了它的范围,它的目标是。它试图验证这个结构。字段之间的依赖关系是业务约束,而不是结构约束。

我认为,要实现可读的错误消息,最好的方法是有两个子属性,每个属性包含8个值;一个用于代码,一个用于值。

然后你就会得到

代码语言:javascript
复制
$.part.relationship.code does not have a value in the enumeration [1,2,3,4 ...

代码语言:javascript
复制
$.part.relationship.value does not have a value in the enumeration ["MEMBER", "SPOUSE", ...

如果强制执行该约束对您很重要,您可以在模式验证的基础上进行一些额外的业务验证。然后生成您自己的错误,例如

代码语言:javascript
复制
code "1" does not match value "SPOUSE"
票数 3
EN

Stack Overflow用户

发布于 2021-05-25 23:42:07

如果codevalue的值总是相对相同的,那么为什么在JSON中都编码呢?只需在JSON中编码一个值,并在应用程序中推断另一个值。

这将更容易验证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67626506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档