如何在JSON Schema验证器中应用子模式?

时间:2015-07-13 15:21:13

标签: java json schema jsonschema

您好我使用版本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的模式?谢谢!!

1 个答案:

答案 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一样运行到模式文件中对象的定义。