您好我使用版本2.2.6中的JSON Schema evaluator来验证我的服务器响应。这些响应可以包含A,B或C类型的单个对象,但也可以包含复合对象,例如,包含A对象数组的D。为了重用每个对象的模式定义,我开始在描述here所描述的同一文件中描述所有实体。现在我的问题是,在验证响应时我必须引用其中一个单个对象。
这是我的(不是)SWE。
JSON架构文件:
{
"id":"#root",
"properties": {
"objecta": {
"type": "object",
"id":"#objecta",
"properties": {
"attribute1": {"type": "integer"},
"attribute2": {"type": "null"},
},
"required": ["attribute1", "attribute2"]
},
"objectb": {
"type": "object",
"id":"#objectb",
"properties": {
"attribute1": {"type": "integer"},
"attribute2": {
"type": "array",
"items": {
"$ref": "#/objecta"
}
}
}
},
"required": ["attribute1", "attribute2"]
},
}
}
现在我想验证包含对象B的服务器响应。为此,我尝试了以下内容:
public class SchemeValidator {
public static void main(String[] args) {
String jsonData = pseudoCodeFileLoad("exampleresponse/objectb.txt");
final File jsonSchemaFile = new File("resources/jsonschemes/completescheme.json");
final URI uri = jsonSchemaFile.toURI();
ProcessingReport report = null;
try {
JsonSchemaFactory factory = JsonSchemaFactory.byDefault();
final JsonSchema schema = factory.getJsonSchema(uri.toString() + "#objectb");
JsonNode data = JsonLoader.fromString(jsonData);
report = schema.validate(data);
} catch (JsonParseException jpex) {
// ... handle parsing errors etc.
}
}
}
问题是该方案未正确加载。我得到没有错误(即使是无效的回复)或者我得到fatal: illegalJsonRef
因为该方案似乎是空的。如何在Java代码中使用对象b的模式?谢谢!!
答案 0 :(得分:0)
看起来你的$ ref不正确。它需要是来自JSON Schema文件基础的相对引用(请参阅here)。
所以你的JSON模式将成为:
{
"id":"#root",
"properties": {
"objecta": {
"type": "object",
"id":"#objecta",
"properties": {
"attribute1": {"type": "integer"},
"attribute2": {"type": "null"},
},
"required": ["attribute1", "attribute2"]
},
"objectb": {
"type": "object",
"id":"#objectb",
"properties": {
"attribute1": {"type": "integer"},
"attribute2": {
"type": "array",
"items": {
"$ref": "#/properties/objecta"
}
}
}
},
"required": ["attribute1", "attribute2"]
},
}
}
我已添加' / properties'你的$ ref。它像XPath一样运行到模式文件中对象的定义。