2016-08-03 47 views
2

目前我们使用的模式文件包含oneOf和2个模式:一个用于PATCH请求,一个用于POST请求。在Java代码中,我们检查请求中的id是否可用,然后检查oneOf节中是否有第一个模式的错误消息。如何在JSON模式中使用oneOf来验证POST和PATCH请求?

事情是这样的:

 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文件,但我们的技术经理宁愿将它们放在一个地方。

+0

您是不是要根据属性中包含的值选择模式?然后看看这个:http://stackoverflow.com/questions/18375506/how-to-use-dependencies-in-json-schema-draft-04/18384131#18384131 – jruizaranguren

+0

@jruizaranguren从类型中选择模式,但我的情况是不同的。在我的情况下,类型是相同的。 (假设它总是公司),但是选择哪个模式取决于属性'id'是否可用。我想过'依赖关系',但是只有在y出现时才能说检查属性x。我们如何使用'依赖关系'来表示在id出现时选择这个模式?你能给我举个例子吗? JSON模式对我来说有点难理解 – xbmono

回答

1

oneOfanyOf子句可用于模拟条件约束。以下模式将根据修补程序或帖子模式验证属性:

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