当前位置: 首页 > 面试题库 >

如何在JSON模式中使用定义(草案04)

阎昌勋
2023-03-14
问题内容

我正在使用的其余服务响应类似于以下示例,这里仅包括3个字段,但还有更多内容:

{
    "results": [
        {
            "type": "Person",
            "name": "Mr Bean",
            "dateOfBirth": "14 Dec 1981"
        },
        {
            "type": "Company",
            "name": "Pi",
            "tradingName": "Pi Engineering Limited"
        }
    ]
}

我想为上述(草案04)编写一个JSON模式文件,该文件将明确指定:

if type == Person then list of required properties is ["type", "name", "dateOfBirth", etc] 
OR
if type == "Company" then list of required properties is ["type", "name", "tradingName", etc]

但是,找不到任何文档或如何执行此操作的示例。

目前,我的JSON模式如下所示:

{
    "$schema": "http://json-schema.org/draft-04/schema",
    "type": "object",
    "required": ["results" ],
    "properties": {
        "results": {
            "type": "array",
            "items": {
                "type": "object",
                "required": ["type", "name"],
                "properties": {
                    "type": { "type": "string" },
                    "name": { "type": "string" },
                    "dateOfBirth": { "type": "string" },
                    "tradingName": { "type": "string" }
                }
            }
        }
    }
}

我应该如何处理的任何指针/示例。


问题答案:

我认为推荐的方法是Json-Schema web Example2中显示的方法。您需要使用一个枚举来“按值”选择架构。在您的情况下,它将类似于:

{
    "type": "object",
    "required": [ "results" ],
    "properties": {
        "results": {
            "type": "array",
            "items": {
                "oneOf": [
                    { "$ref": "#/definitions/person" },
                    { "$ref": "#/definitions/company" }
                ]
            }
        }
    },
    "definitions": {
        "person": {
            "properties": {
                "type": { "enum": [ "person" ] },
                "name": {"type": "string" },
                "dateOfBirth": {"type":"string"}
            },
            "required": [ "type", "name", "dateOfBirth" ],
            "additionalProperties": false
        },
        "company": {
            "properties": {
                "type": { "enum": [ "company" ] },
                . . . 
            }        
        }
    }
}


 类似资料:
  • 我正在使用Jackson模式模块为Rest API生成JSON模式,当开始使用https://github.com/fge/json-schema-validator针对对我的API的请求实现JSON模式验证时,我意识到Jackson生成的是模式v3,而验证器只支持V4-draft。在寻找其他java JSON模式生成器库之前,您能确认Jackson不支持V4吗?您能推荐其他java JSON模式

  • 我试图使用从另一个json模式导入定义,但得到以下错误: 目录结构: 通过使用绝对路径、url和路径的其他几种组合,我尝试了几种组合。不知道是怎么回事。 架构验证器:

  • 使用Jackson(最新版本可以)为JAVA bean/POJO类生成一个JSON模式,这样它就可以正确地包含嵌套对象的结构,并且还希望向嵌套POJO添加自定义属性(在我的例子中,希望为每个嵌套POJO参数添加一个完全分类的classname属性)。 用例- 比如说,我有一个Person类,如下所示。我用这个人作为我某个操作的参数。- 这个问题肯定与此相关--如何使用jackson遍历生成的jso

  • 我尝试使用swagger来描述JSON API。到目前为止,它看起来不错,但我无法弄清楚如何使用anyOf结构在JSON答案中定义不同对象类型的数组。 以下JSOn模式是有效的,它应该描述一组文章和视频JSON对象: 有没有可能在摇摆不定中使这项工作发挥作用?

  • 我正在尝试使用OAS v2定义一个API,它将返回一个有效负载以及一些元数据。 换句话说,对API的响应将是: 有效负载可以是任何内容,并且在不同的场景下会有所不同,唯一的限制是它将是有效的JSON格式。因此,现在,我想将其定义为一个JSON对象,而不定义字段级别的细节。 如何在OAS2/JSON模式中做到这一点? 提前谢谢。