如何在JSON模式中使用oneOf来验证POST和PATCH请求?

时间:2016-08-03 08:16:54

标签: java json jsonschema json-schema-validator

目前我们使用的模式文件包含带有2个模式的 oneOf :一个用于PATCH请求,另一个用于POST请求。在Java代码中,我们检查请求中是否有id,然后我们检查oneOf部分中的第一个模式是否有任何错误消息。

这样的事情:

        processingReport.iterator().forEachRemaining(processingMessage -> {
        JsonNode json = processingMessage.asJson();

        JSONObject reports = new JSONObject(json.get("reports").toString());
        logger.debug("Schema validation: {}", reports.toString());
        //Seems always has 2 reports.
        String reportIdentifier = isCreate ? "/properties/data/oneOf/0" : "/properties/data/oneOf/1";
        JSONArray errorsArray = new JSONArray(reports.get(reportIdentifier).toString());

        //Do something with the error here

    });

但这对我来说似乎不对。有没有办法在架构中管理这个,所以当id可用时,它会从oneOf中选择正确的架构,或者有更好的方法可以做到这一点?

我知道一个选项是使用不同的json文件,但我们的技术经理宁愿将它们保存在一个位置。

1 个答案:

答案 0 :(得分:2)

oneOfanyOf子句可用于建模条件约束。以下模式将验证补丁或发布模式,具体取决于id属性的存在:

{
    "oneOf" : [{
            "$ref" : "/post_request_schema#"
        }, {
            "allOf" : [{
                    "$ref" : "/patch_request_schema#"
                }, {
                    "required" : ["id"]
                }
            ]
        }
    ]
}